подстановка команд прерывает подстановку команд

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

делаю ли я:

dirname "$0"                                      # works
echo "`dirname "$0"`"                             # works
echo "$(dirname "$0")"                            # works
cat <<< "`dirname "$0"`"                          # works
cat <<< "$(dirname "$0")"                         # works
"$(dirname "$0")"/setup_buildroot.sh "$BUILDROOT" # call the sub-script
dirname "$0"                                      # works
echo "`dirname "$0"`"                             # empty string
echo "$(dirname "$0")"                            # empty string
cat <<< "`dirname "$0"`"                          # crash
cat <<< "$(dirname "$0")"                         # crash

or i do:

dirname "$0"                                      # works
echo "`dirname "$0"`"                             # works
echo "$(dirname "$0")"                            # works
cat <<< "`dirname "$0"`"                          # works
cat <<< "$(dirname "$0")"                         # works
"`dirname "$0"`"/setup_buildroot.sh "$BUILDROOT"  # call the sub-script
dirname "$0"                                      # works
echo "`dirname "$0"`"                             # empty string
echo "$(dirname "$0")"                            # empty string
cat <<< "`dirname "$0"`"                          # crash
cat <<< "$(dirname "$0")"                         # crash

dirname работает нормально, но обратная кавычка и $() перестают работать. Подстановка команды просто возвращает пустую строку.

РЕДАКТИРОВАТЬ: удаление всех двойных кавычек "" не имеет эффекта

EDIT2: явное выполнение bash при вызове индекса не имеет никакого эффекта

EDIT3: сохранение "$(dirname "$0")" в переменную и использование этого не имеет никакого эффекта

EDIT4: добавление тех же команд echo в индекс показывает, что в индексе все в порядке.

EDIT5: по запросу вывод скрипта

/home/jayen/rep
/home/jayen/rep
/home/jayen/rep
/home/jayen/rep
/home/jayen/rep
#setup_buildroot.sh output here
/home/jayen/rep


bash: syntax error near unexpected token `newline'
bash: syntax error near unexpected token `newline'

person Jayen    schedule 19.11.2012    source источник
comment
Нормально работает, если просто закомментировать строку для вызова индекса? Просто хотел убедиться.   -  person anishsane    schedule 19.11.2012
comment
Можете ли вы дать некоторые подробности о подписке?   -  person anishsane    schedule 19.11.2012
comment
Кроме того, попробуйте переместить свои скрипты в каталог, не содержащий специальных символов, таких как пробел. Вы уверены, что нижний индекс заканчивается и возвращает управление обратно в родительский скрипт?   -  person anishsane    schedule 19.11.2012
comment
Пожалуйста, покажите фактический вывод кода.   -  person chepner    schedule 19.11.2012
comment
да, работает нормально, если просто закомментировать строку, вызывающую sub-script. Это также работает, если у меня не было нижнего индекса, а 2 или 3 строки были встроенными.   -  person Jayen    schedule 20.11.2012
comment
Скрипты не находятся в каталоге со специальными символами. Вся защита предназначена для тех, кто может использовать сомнительные имена каталогов.   -  person Jayen    schedule 20.11.2012
comment
Как нижний сценарий может заканчиваться и влиять на родительский сценарий? Он завершается со статусом 0 (запускается напрямую или из скрипта). Интерактивная оболочка не оказывает вредного воздействия.   -  person Jayen    schedule 20.11.2012


Ответы (2)


Я чувствую, что вызов подскрипта нарушает переменные среды вашего существующего сеанса сценария bash. Может быть, попробуйте добавить к строке нижнего индекса префикс bash, чтобы

bash "`dirname "$0"`"/setup_buildroot.sh "$BUILDROOT"

и посмотрите, решит ли это проблему. Это странная ситуация.

Другое решение, которое я рекомендую, находится в первой строке, выполните

mydir="$0"

и замените все $0 на $mydir

а еще лучше сделать

mydir=`dirname "$0"`

заранее и не повторно запускать команду снова и снова.

person coder543    schedule 19.11.2012
comment
попробовал оба. ни на что не влияет! bash "$HERE"/setup_buildroot.sh $BUILDROOT - person Jayen; 19.11.2012
comment
замена всех $0 в вашем скрипте на $HERE (где HERE=`dirname "$0"`) не сработала? - person coder543; 19.11.2012
comment
я просто заменил этот. это первый в сценарии. - person Jayen; 19.11.2012
comment
Я имел в виду не только строку, связанную с индексом. У вас много эхо и котов, и их тоже надо менять. Если ваш сценарий повторяет все несколько раз, это не имеет большого значения, если только первый запуск не сработает. - person coder543; 19.11.2012
comment
остальная часть скрипта работала нормально, пока я не извлек несколько строк в нижний скрипт - person Jayen; 20.11.2012
comment
У меня была похожая (не такая же) проблема, когда скрипт, который я запускал много раз в прошлом, перестал работать. Некоторое базовое обновление привело к тому, что исполняемая оболочка стала sh. Я не уверен, почему эта нарушенная подстановка команд, но форсирование bash решило проблему, и скрипт запустился. - person WAF; 26.07.2016

это не имеет смысла, но попробуйте найти свой индекс

. "$(dirname "$0")"/setup_buildroot.sh "$BUILDROOT" # call the sub-script
person Jayen    schedule 19.11.2012