Параметр onecmd оболочки Bash Назначение использования

/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, что, похоже, не соответствует вероятному намерению автора сценария.

3
04.07.2020, 18:40
1 ответ

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

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.

4
18.03.2021, 23:22

Теги

Похожие вопросы