2014-09-03 10 views
1

У меня есть сценарий оболочки на Mac (OSX 10.9) с именем msii810161816_TMP_CMD со следующим контентом.«Command not found» внутри сценария оболочки

matlab 

Когда я исполню его, я получаю

./msii810161816_TMP_CMD: line 1: matlab: command not found 

Однако, когда я типа MATLAB в оболочку непосредственно начинается в обычном режиме. Как может быть, что одна и та же команда работает внутри оболочки, но не внутри сценария оболочки? Я копировать-вставить команду непосредственно из сценария в оболочку, и она работала ...

PS: Когда я заменить содержимое скрипта с

echo matlab 

я получить желаемый результат, так что я могу определенно выполните сценарий оболочки (я использую ./msii810161816_TMP_CMD)

Спасибо, ребята!

+0

Сценарий оболочки является исполняемым (я выполнил его с эхо MATLAB). Что такое линия shebang? Единственное содержимое моего файла - «matlab» – megavore

+0

Если по строке shebang вы подразумеваете добавление #!/Bin/sh в начало скрипта, я просто сделал это, но это не имело никакого значения. – megavore

+0

попробуйте заменить matlab на/full/path/to/matlab –

ответ

-1

Это потому, что, как заявили комментаторы, переменная PATH внутри оболочки, выполняющей скрипт, не включает каталог, содержащий исполняемый файл matlab.

При использовании имени команды, такого как «matlab», ваша оболочка просматривает каждый каталог в PATH по порядку, ища файл, содержащий исполняемый файл с именем «matlab».


Не вдаваясь в излишние подробности, то PATH определяется скорлупа быть вызван. Когда вы выполняете bash, он объединяет глобальные настройки для базовых каталогов, которые должны быть в PATH с любыми настройками в вашем ~/.bashrc, которые изменяют PATH.

Скорее всего, вы не используете свой скрипт в оболочке, где PATH содержит каталог matlab. Чтобы проверить это, вы можете предпринять следующие шаги:

  • Run which matlab. Это покажет вам путь к исполняемому файлу matlab.
  • Пробег echo "$PATH". Это покажет вам текущие настройки PATH. Обратите внимание, что каталог из which matlab включен в список разделенных двоеточиями.
  • Добавьте строку в начало вашего скрипта, который делает echo "$PATH". Обратите внимание, что каталог от which matlab не включен.

Для решения этой проблемы убедитесь, что ваш скрипт выполнен в оболочке, которая имеет нужный каталог в PATH. Вы можете сделать это несколько способов, но два наиболее рекомендуемыми бы

  1. Добавить хижину строку в начале вашего скрипта. Предполагая, что вы хотите запустить его с помощью bash, сделайте #!/bin/bash или каким бы ни был путь к вашему интерпретатору bash. Линия shebang на самом деле не полностью стандартизирована POSIX, поэтому BSD-производные системы, такие как OSX, с удовольствием обрабатывают несколько аргументов исполняемого файла shebanged, в то время как системы Linux передают не более одного аргумента. Несмотря на это, shebang - это простой и простой способ документировать, что должно использоваться для выполнения сценария, поэтому это хорошее решение.

  2. Явного вызвать скрипт с оболочкой в ​​качестве интерпретатора, как в bash myscript.sh или tcsh myscript.sh или даже sh myscript.sh Это не является несовместимым с использованием притоном линии, и использования как является обычной практикой. Я считаю, что оболочкой по умолчанию на OSX всегда является bash, поэтому вы должны начать с этого.


Если эти инструкции не помогают, то вам придется копать глубже, чтобы выяснить, почему или как PATH в настоящее время изменяются между контекстом вызова и внутренним контекстом сценария. В конечном счете, это почти наверняка является источником вашей проблемы.

0

По умолчанию псевдонимы не разворачиваются в неинтерактивных оболочках, которые являются сценариями оболочки. Псевдонимы предназначены для использования человеком на клавиатуре в качестве набора текста.

Если ваша цель состоит в том, чтобы не вводить полный путь до matlab, вместо создания псевдонима вы должны изменить свой $PATH. Добавить /Applications/MATLAB_R2014a.app/bin в свой $PATH environment variable, а затем, как вы и ваши скрипты будут иметь возможность просто сказать

matlab 
Смежные вопросы