exit
завершает обработку вызовов. При большинстве обстоятельств это выходит из целого сценария даже при вызове его из цикла, функции или включенного сценария. Единственные конструкции оболочки та “выгода” exit
те, которые представляют подоболочку (т.е. разветвленный дочерний процесс оболочки):
(…)
это выполняет команду в круглых скобках в подоболочке;$(…)
(и ее эквивалент устаревший, одинарные левые кавычки `…`
), который выполняет команду и возвращает ее вывод как строку;&
;|
, и правая сторона также на большинстве оболочек (ATT ksh и zsh быть исключениями);<(…)
, >(…)
, и т.д., на ksh, ударе и zsh.Можно убежать из a while
или for
цикл с break
ключевое слово, и можно убежать из функции с return
ключевое слово.
Можно использовать tee
команда, которая принимает вход от stdin и пишет вывод в stdout плюс файл.
command | (umask 077; exec tee "/tmp/out.$$")
Затем Вы можете test -s "/tmp/out.$$"
видеть, является ли это нулевую длину или нет. (Отметьте это $$
расширяется до текущего pid, который помогает избежать подобных процессов, перезаписывающих друг друга. Можно предпочесть использовать mktemp
где это возможно для предотвращения проблем, где взломщик предположил бы имя файла и создал бы символьную ссылку в ее месте),
if the-command | grep '^'; then
echo the-command output was not empty
fi
(обратите внимание, что поведение будет варьироваться через grep
реализации, если вывод the-command
не текст (содержит символы NUL, не заканчивается в символе новой строки или имеет неправильно длинные линии).
Также проверять статус выхода the-command
, Вы могли использовать pipefail
опция, доступная во многих оболочках (удар, ksh93, zsh, yash, mksh, по крайней мере):
if (set -o pipefail; the-command | grep '^'); then
echo the-command was successful and its output was not empty
fi
Для работы с нетекстовыми данными можно заменить grep '^'
с:
PERLIO=:unix perl -pe 'BEGIN{$/=\65536} END{exit!$.}'
Обратите внимание на те некоторые изменения команд их поведение вывода, когда их stdout не является оконечным устройством (здесь измененный на канал), так, чтобы мог все еще иметь эффект на вывод.
Это, кажется, работает:
#!/bin/bash
OUTPUT="$(echo "foo")" # replace 'echo "foo"' with your command
if [[ -z "$OUTPUT" ]]; then
echo "No output."
else
echo "$OUTPUT"
fi
tee
вероятно, Ваш лучший выбор.
– DopeGhoti
23.12.2013, 23:25
-n
или -nene
... и это удалит запаздывающие символы новых строк (и добавит тот назад).
– Stéphane Chazelas
24.12.2013, 00:15
/dev/tty
и избегайте временного файла:out=$(echo 'hi'|tee /dev/tty)
– Ernest A 23.12.2013, 23:15