Вот три вещи, которые можно сделать с заменой процесса, которые невозможны иначе.
diff <(cd /foo/bar/; ls) <(cd /foo/baz; ls)
Просто нет никакого способа сделать это с каналами.
Скажите, что у Вас есть следующее:
curl -o - http://example.com/script.sh
#/bin/bash
read LINE
echo "You said ${LINE}!"
И Вы хотите выполнить его непосредственно. Следующее терпит полный провал. Bash уже использует STDIN для чтения сценария, таким образом, другой вход невозможен.
curl -o - http://example.com/script.sh | bash
Но этот путь работает отлично.
bash <(curl -o - http://example.com/script.sh)
Также обратите внимание, что замена процесса работает другой слишком. Таким образом, можно сделать что-то вроде этого:
(ls /proc/*/exe >/dev/null) 2> >(sed -n \
'/Permission denied/ s/.*\(\/proc.*\):.*/\1/p' > denied.txt )
Это - определенный замысловатый пример, но он отправляет stdout в /dev/null
, в то время как передача по каналу stderr к sed сценарию для извлечения названий файлов, для которых "Разрешение отклонило" ошибку, была отображена и затем отправляет ТЕ результаты в файл.
Обратите внимание, что первая команда и stdout перенаправление находятся в круглых скобках (подоболочка) так, чтобы только результат ТОЙ команды был отправлен в /dev/null
и это не смешивает с остальной частью строки.
Можно сделать это как это:
#!/bin/sh
ls -lh &&
# This is a comment
echo 'Wicked, it works!'
Я надеюсь, что понял то, что Вы спросили правильно.
Можно изменить строку хижины на
#!/bin/bash -e
После любой ошибки остановится сценарий.
bash
часть, конечно). Оболочка POSIX берет набор опций, которые применимы к set
. Или наоборот? set
способ установить параметры командной строки оболочки в рамках сценария. Солярис
– Kaz
03.02.2013, 05:38
-e
на хижине, пока один администратор моей компании не продолжал запускать мои сценарии с bash myscript.sh
, таким образом, это проигнорировало -e
. Теперь все мои сценарии имеют a set -e
во второй строке.
– Carlos Campderrós
04.02.2013, 10:00
Если Вам не нравится set -e
идея, возможно, можно инвертировать логику.
foocommand || exit 1
foocommand2 || exit 2
foocommand3 || exit 3
Более полезно, замена exit
с чем-то для печати полезного сообщения об ошибке затем выйдите. В функции, конечно, Вы хотите return
вместо exit
.
foocommand || exit
выходить с foocommand
статус выхода, если ненулевой.
– Stéphane Chazelas
02.02.2013, 23:10
Можно использовать if else fi
блоки вместо этого.
if foocommand; then
# some comments
if foocommand2; then
# more comments
foocommand3
fi
fi
Это немного более читаемо.
Кроме того, можно просто использовать \
повредить Ваш большой 1 лайнер в несколько строк
foocommand && \
# some comment
foocommand2 && \
# more comment
foocommand3
Но конечно это может сбивать с толку нетренированный глаз.
Вы могли рассмотреть использование вложенный if
операторы. Другая опция состоит в том, чтобы использовать curly's для группировки как { true && echo hi; } || echo huh
Обновление 1:
Вот пример без новых строк/комментариев:
{ { false && echo "inner true"; } && { echo "inner true" && true; } || { echo "inner false" && false; } || echo "outter false"; }
Разделите каждую последовательность команд в функции:
big_block_1() {
# ...
}
big_block_2() {
# ...
}
big_block_3() {
# ...
}
big_block_1 && big_block_2 && big_block_3
Мне всегда нравится писать функцию "сбоя", которая позволяет мне указать вещь, которую я собирался сделать, когда отказ произошел, и затем используйте ||
шаблон. Как следующее:
function fail() {
echo "Failure: ${@}"
exit 1
}
foocommand || fail "couldn't foo"