Мотивация
Я нахожусь в ситуации, когда мне приходится запускать несколько команд bash с одним вызовом bash без возможности написать полный файл сценария (вариант использования: Передача нескольких команд в контейнер в Kubernetes). общее решение состоит в том, чтобы объединить команды с ;
или &&
, например:
bash -c " \
echo \"Hello World\" ; \
ls -la ; \
run_some_command "
На практике написание таких bash-скриптов чревато ошибками, потому что я часто забываю точку с запятой, что приводит к незаметным ошибкам.
Вдохновленный этим вопросом, я экспериментировал с написанием сценариев в более стандартном стиле, используя heredoc:
bash <<EOF
echo "Hello World"
ls -la
run_some_command
EOF
К сожалению, я заметил разницу в обработке ошибок кода выхода при использовании heredoc. Например:
bash -c " \
run_non_existing_command ; \
echo $? "
выходы (обратите внимание, что $?
правильно фиксирует код выхода):
bash: run_non_existing_command: command not found
127
тогда как
bash <<EOF
run_non_existing_command
echo $?
EOF
выходные данные (обратите внимание, что $?
не может захватить код выхода по сравнению со стандартным выполнением скрипта):
bash: line 1: run_non_existing_command: command not found
0
Почему версия heredoc ведет себя иначе? Можно ли написать скрипт в стиле heredoc и поддерживать нормальную обработку кода выхода?
for instance:
— ваш экземпляр не объединяет команды (по крайней мере, не так, как я определяю «комбинировать»), он запускаетbash -c echo "Hello World"
, а затем запускаетls -la
иrun_some_command
, все в родительской оболочке. Я думаю, что вам не хватает\слешей - person KamilCuk   schedule 15.10.2019bash -c "echo \"Hello World\" ; ls -la ; run_some_command ;"
- person KamilCuk   schedule 15.10.2019