Как я могу сидеть в на потоке без мешания при получении и тестировании его?

exit завершает обработку вызовов. При большинстве обстоятельств это выходит из целого сценария даже при вызове его из цикла, функции или включенного сценария. Единственные конструкции оболочки та “выгода” exit те, которые представляют подоболочку (т.е. разветвленный дочерний процесс оболочки):

  • основная конструкция подоболочки (…) это выполняет команду в круглых скобках в подоболочке;
  • конструкция замены команды $(…) (и ее эквивалент устаревший, одинарные левые кавычки `…`), который выполняет команду и возвращает ее вывод как строку;
  • фоновые задания, разветвленные с &;
  • левая сторона канала |, и правая сторона также на большинстве оболочек (ATT ksh и zsh быть исключениями);
  • некоторые оболочки имеют другие конструкции подпроцесса, например, обрабатывают замену <(…), >(…), и т.д., на ksh, ударе и zsh.

Можно убежать из a while или for цикл с break ключевое слово, и можно убежать из функции с return ключевое слово.

3
05.01.2018, 10:12
3 ответа

Можно использовать tee команда, которая принимает вход от stdin и пишет вывод в stdout плюс файл.

command | (umask 077; exec tee "/tmp/out.$$")

Затем Вы можете test -s "/tmp/out.$$" видеть, является ли это нулевую длину или нет. (Отметьте это $$ расширяется до текущего pid, который помогает избежать подобных процессов, перезаписывающих друг друга. Можно предпочесть использовать mktemp где это возможно для предотвращения проблем, где взломщик предположил бы имя файла и создал бы символьную ссылку в ее месте),

3
27.01.2020, 21:16
  • 1
    я думаю, что могу класть для первого удара к /dev/tty и избегайте временного файла: out=$(echo 'hi'|tee /dev/tty) –  Ernest A 23.12.2013, 23:15
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 не является оконечным устройством (здесь измененный на канал), так, чтобы мог все еще иметь эффект на вывод.

1
27.01.2020, 21:16

Это, кажется, работает:

#!/bin/bash

OUTPUT="$(echo "foo")"  # replace 'echo "foo"' with your command

if [[ -z "$OUTPUT" ]]; then
   echo "No output."
else
   echo "$OUTPUT"
fi
1
27.01.2020, 21:16
  • 1
    Да, это работает, но имеет недостаток, что строки печатаются внезапно, тогда как команда может распечатать строки на определенном уровне. –  Ernest A 23.12.2013, 23:17
  • 2
    Да, если Вы хотите видеть вывод в режиме реального времени, tee вероятно, Ваш лучший выбор. –  DopeGhoti 23.12.2013, 23:25
  • 3
    Это не принимает символа NUL в выводе, что вывод не -n или -nene... и это удалит запаздывающие символы новых строк (и добавит тот назад). –  Stéphane Chazelas 24.12.2013, 00:15

Теги

Похожие вопросы