Я заранее прошу прощения, если это дублирующий вопрос. Я приложил усилия для поиска / проверки, прежде чем спрашивать здесь.
Мне удобно писать однострочники, как это:
foocommand && foocommand2 && foocommand3
Идея в том, что я хочу, чтобы последующие команды выполнялись только в том случае, если предыдущая была «успешной».
Я пишу довольно длинный скрипт, и этот однострочный текст неосуществим, потому что он выглядит как огромный блок запутанного кода для всех остальных.
Я хочу разместить команды и написать комментарии между ними в скрипте. Как я могу сделать это и при этом иметь эквивалент && там?
&&
не означает , что последующая команда будет работать , если предыдущий один был успешным. Это означает , что команда будет работать , если коллективный результат из всех предыдущих команд в списке команд успеха. Вы можете знать это, но будущие читатели могут неправильно понять.||
и&&
(в отличие от|
или&
) называется коротким замыканием. Поведение, используемое с последними операторами, называется энергичной оценкой.a && b && c
будет работать только ,b
еслиa
удастся, так что «это работает только ,c
еслиb
удастся» и «она работает толькоc
еслиa
иb
как добиться успеха» эквивалентны утверждения:b
не может быть успешным , еслиa
не удалось.a || b && c
более показателен.true || false && echo hi
будет выводитьhi
. Спецификация гласит : операторы "&&" и "||" должен иметь равный приоритет и должен оцениваться с левой ассоциативностью.Ответы:
Вы можете сделать это так:
Надеюсь, я правильно понял, что вы спросили.
источник
Вы можете изменить линию Шебанга на
После любой ошибки скрипт остановится.
источник
bash
части конечно). Оболочка POSIX принимает множество параметров, которые применимы кset
. Или наоборот?set
способ установки параметров командной строки оболочки в скрипте-e
могут плохо себя вести. Например, вы, вероятно, не хотите, чтобы ваш скрипт завершал работу каждый раз, когда у васdiff
два неидентичных файла. Конечно, вы можете обойти это, добавляя|| true
(или, возможно|| [ $? = 1 ]
) к таким командам, но ОП упоминает «всех остальных», которым придется читать этот сценарий, и говорит, что «все остальные», вероятно, не будут привыкать к необходимости справиться с-e
.-e
ее, пока один администратор моей компании не продолжал запускать мои скриптыbash myscript.sh
, поэтому он игнорировал-e
. Теперь все мои скриптыset -e
во второй строке.Если вам не нравится
set -e
идея, возможно, вы можете инвертировать логику.Полезнее заменить
exit
на что-нибудь, чтобы напечатать полезное сообщение об ошибке, а затем выйти. Внутри функции, конечно, вы хотитеreturn
вместоexit
.источник
foocommand || exit
для выхода сfoocommand
выходным статусом, если не ноль.Вы можете использовать
if else fi
блоки вместо этого.Это немного более читабельно.
Кроме того, вы можете просто использовать,
\
чтобы разбить ваш большой 1 лайнер на несколько строкНо, конечно, это может сбить с толку неподготовленного глаза.
источник
\
там необходимо.Вы можете рассмотреть возможность использования вложенных
if
операторов. Другой вариант заключается в использовании кудрявых для группировки как{ true && echo hi; } || echo huh
Обновление 1:
Вот пример без новых строк / комментариев:
источник
Разделите каждую последовательность команд на функции:
источник
Мне всегда нравится писать функцию «сбой», которая позволяет мне указать, что я собирался сделать, когда произошел сбой, а затем использовать
||
шаблон. Как следующее:источник