/opt/ros/indigo/setup.bash
по существу пытается сделать это:
CATKIN_SHELL=bash
cd /opt/ros/indigo
_CATKIN_SETUP_DIR="/opt/ros/indigo"
. "$_CATKIN_SETUP_DIR/setup.sh"
Исходный сценарий пытается извлечь абсолютный путь setup.bash
из $BASH_SOURCE[0]
, переключиться на этот каталог и записать часть пути, относящуюся к каталогу, как переменную окружения _CATKIN_SETUP_DIR
.
Наконец, он попытается получить setup.sh
по пути, указанному в переменной окружения _CATKIN_SETUP_DIR
.
Используете ли вы оболочку, отличную от bash
? (Если вы не знаете, запустите echo $0; echo $SHELL
и добавьте результаты в сообщение с вопросом.)
Анализ линии:
_CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)
Для оболочки, отличной от bash
, $BASH_SOURCE[0]
, скорее всего, расширится в пустую строку, тогда dirname ""
результаты .
, builtin cd.
ничего не изменят и будут успешными, и после этого pwd
приведет к захвату текущего каталога в качестве нового значения для _CATKIN_SETUP_DIR
, что, похоже, не соответствует вероятному намерению автора сценария.
Почему, я не знаю, но обратите внимание, что вы можете установить параметры в командной строке при запуске оболочки, например. здесь внутренняя оболочка читает одну команду и затем завершает работу
bash$ PS1='onecmd$ ' bash -t
onecmd$ echo moi;
moi
bash$
А также то, что он на самом деле не завершает работу после чтения одной команды, а читает и выполняет как минимум одну полную строку . Вот то же самое с двумя командами:
bash$ PS1='onecmd$ ' bash -t
onecmd$ echo moi; echo hei
moi
hei
bash$
Конечно, используя, например,. &&
или перенос всего набора команд в if true; then... fi
.