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
То, что никакая другая оболочка не нуждается в таком обходном пути, является убедительным признаком того, что это ошибка в OpenBSD ksh. На самом деле, ksh93 не показывает такой проблемы.
Наличие ||
в командной строке должно предотвратить выход из оболочки, вызванный кодом возврата 1 слева от нее.
Ошибка специальной встроенной -должна вызывать выход из неинтерактивной оболочки в соответствии с POSIX , но это не всегда так. Попытка continue
выйти из цикла является ошибкой, а continue
— встроенной функцией. Но большинство снарядов не выходят на:
continue 3
Встроенная функция, которая выдает четкую ошибку, но не завершает работу.
Итак, выход на false
генерируется условием set -e
, а не встроенной характеристикой команды(eval
в данном случае ).
Точные условия, при которых set -e
должен выйти, в POSIX гораздо более нечеткие.
[извините, если это не настоящий ответ, я обновлю его, когда доберусь до него]
Я просмотрел исходный код и сделал следующие выводы::
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
и т. д.