Поведение «eval» при «set -e» в условном выражении

bash не расширяет содержимое переменной внутри строки одинарных кавычек. Вы должны использовать строки в двойных кавычках.

Примеры:

Это напечатает: меня зовут: $ name

name="haha"
echo 'my name is : $name'

Это напечатает: меня зовут: ха-ха

name="haha"
echo "my name is : $name"

Так что просто замените

perl -pi -e 's/PLACEHOLDER_BACKEND_NAME.*/PLACEHOLDER_BACKEND_NAME=$name/g' ~/psth-to-file.sh

на

perl -pi -e "s/PLACEHOLDER_BACKEND_NAME.*/PLACEHOLDER_BACKEND_NAME=$name/g" ~/psth-to-file.sh
9
10.06.2019, 20:52
2 ответа

То, что никакая другая оболочка не нуждается в таком обходном пути, является убедительным признаком того, что это ошибка в OpenBSD ksh. На самом деле, ksh93 не показывает такой проблемы.

Наличие ||в командной строке должно предотвратить выход из оболочки, вызванный кодом возврата 1 слева от нее.

Ошибка специальной встроенной -должна вызывать выход из неинтерактивной оболочки в соответствии с POSIX , но это не всегда так. Попытка continueвыйти из цикла является ошибкой, а continue— встроенной функцией. Но большинство снарядов не выходят на:

continue 3

Встроенная функция, которая выдает четкую ошибку, но не завершает работу.

Итак, выход на falseгенерируется условием set -e, а не встроенной характеристикой команды(evalв данном случае ).

Точные условия, при которых set -eдолжен выйти, в POSIX гораздо более нечеткие.

5
27.01.2020, 20:07

[извините, если это не настоящий ответ, я обновлю его, когда доберусь до него]

Я просмотрел исходный код и сделал следующие выводы::

1 )Это баг/ограничение, ничего философского в этом нет.

2 )«Исправление» для него из переносимого форка OpenBSD ksh(mksh)очень плохое, только ухудшает ситуацию, но не исправляет:

Новая ошибка, отличная от всех других оболочек:

mksh -ec 'eval "false; echo yup"'
yup

bash -ec 'eval "false; echo yup"'
(nothing)

Все еще не исправлено:

mksh -ec 'eval "set -e; false" || echo yup'
(nothing)

bash -ec 'eval "set -e; false" || echo yup'
yup

Вы можете заменить bashвыше на dash, zsh, yash, ksh93и т. д.

4
27.01.2020, 20:07

Теги

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