с помощью
time sleep 1
выходы:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
Есть ли команда, которую я могу использовать, чтобы напечатать код выхода sleep
или любую команду, которую я хочу выполнить?
Что-то нравится:
$ log-exit-code sleep 1
возможно этого достаточно?
sleep 1 && echo "$?"
exit
exit-status
Александр Миллс
источник
источник
sleep 1 && echo $?
напечатал бы код спящей ячейки, только когда она равна нулю ...sleep 1 && echo "$?" || echo "$?"
EXIT_CODE=$(tellexit command)
Ответы:
В моем тестировании до сих пор это работало:
command && echo "$?" || echo "$?"
Просто говорит ему, чтобы повторить код выхода, если он успешен или если он терпит неудачу.
Как Сато указал ниже, это по сути то же самое, что и:
command; echo "$?"
Одна вещь, которая может сделать команду and / or стоящей, это что-то вроде:
command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"
Если вам нужен ваш сценарий для обработки кода выхода, как забота Оливье, это не проблема. Ваш скрипт может выглядеть примерно так:
источник
command; echo $?
?command; echo $?
это гораздо лучший ответ.command ; echo $?
потому чтоecho $?
всегда успешно, и, следовательно, после него, новое значение $? теперь равно 0. Существует способ сохранить исходный код возврата даже после его отображения, в случае, если этот исходный код возврата будет полезен позже (например, в скрипте проверка кода возврата важна до принятия решения о том, как продолжить). Смотрите мой ответ для одного из нескольких решений (большинство ответов здесь можно изменить таким же образом)cmd && echo "$?"
не будет работать, так как по необходимости будет только печатать нули (echo
будет выполняться только при успешном завершении предыдущей команды).Вот короткая функция оболочки для вас:
Это печатает код завершения данной команды так же, как и
time
команда.Перенаправляя
printf
to/dev/tty
в функцию, мы все еще можем использоватьtellexit
с перенаправлениями, не получая мусор в наших стандартных выходных данных или потоках ошибок:Сохраняя код выхода в переменной, мы можем вернуть его вызывающей стороне:
Более классная версия той же функции также печатает сигнал, который убил команду, если код выхода больше 128 (что означает, что она прервана из-за сигнала):
Тестирование:
(Для
local
этого требуетсяash
/pdksh
/bash
/zsh
, или вы можете изменить его на то,typeset
что понимают несколько других оболочек.)источник
Используйте функцию оболочки оболочки вещь. Вероятно, с другим именем.
(Это, конечно, приведет к повреждению стандартного вывода, поэтому либо используйте параметр,
tty
показанный @Kusalananda, либо не используйте его вне интерактивного контекста.)Переходя на непортативную территорию, некоторые оболочки могут сообщать о состоянии всех команд в конвейере, а не только о последней, например, в ZSH, если вы хотите, чтобы сбои сообщались из всего конвейера:
TRAPZERR
в противном случае не срабатывает при отсутствии ошибки (по принципу «нет новостей - хорошие новости»).источник
У GNU
time
есть опция для этого:Проходит через код выхода 1 , если не убит сигналом 2 :
Если вы хотите узнать / обработать ситуацию уничтожения сигнала, передайте
-v
и наберите stderr для строкиCommand terminated by signal
.1 Спасибо Оливье Дюлаку за то, что он отметил, что код выхода проходит.
2 Также, спасибо Стефану Шазеласу за то, что он указал, что код выхода сигнала уничтожения не проходит.
источник
0
хотя, если команда убита.256+signum
или,384+signum
или даже,signum/256
илиsignum/256+0.5
если ядро было сгенерировано (фактически статус, возвращаемыйwaitpid()
делением на 256). Некоторые дали бы текстовое представление (какsigint
илиsigquit+core
). Все же, вероятно, стоит обсудить в группе новостей gnu.coreutils.bugs, я согласен.time
это не частьcoreutils
, это пакет сам по себе с собственным списком рассылки об ошибках (bug-time@gnu.org))system()
из традиционных awk, подобных тем, что до сих пор поддерживают Брайан Керниган (k
inawk
) илиnawk
из Solaris,awk
FreeBSD, которые вытекают из этого.awk 'BEGIN{print system("kill -s ABRT $$")}'
выводится,0.523438
когда размер дампа ядра не ограничен. Поведениеgawk
изменилось недавно, с изменяющимся поведением с--traditional
или--posix
(см. Также возвращаемое значениеclose(cmd)
для большего разнообразия)Мне не нравятся все остальные ответы (хотя мне очень нравится их ум): они отображают код выхода, но они также меняют его. (отображаемая часть истинна, следовательно, после нее код возврата равен 0)
Вот модифицированная версия:
источник
time
которая не всегда доступна.Чтобы быть немного более устойчивым, отправьте статус выхода на отдельный FD, чтобы он мог обрабатываться независимо от stdout / stderr:
Обратите внимание, что вам нужно что-то сделать с FD3, или он скажет
Bad file descriptor
.Это может быть дополнительно сконфигурировано для предоставления этих выходов на входы другой программы, когда другая программа прослушивает более одного FD; Вы могли бы использовать это как своего рода Кибана начала 90-х :)
источник
В то время как все другие (очень интересные) ответы касаются точного вопроса, который задал ОП, на практике все обычно проще. Вы просто сохраняете статус выхода в переменную (сразу после команды) и сообщаете или регистрируете ее любым способом, каким хотите. Например, распечатать в / dev / stderr или написать / добавить его в виде текстового сообщения в файл журнала. И это также сохраняется для использования при принятии решений / управлении потоком в последующем коде.
Если это в функции:
Если это прямо в скрипте:
(Уклонение и покрытие, потому что это не отвечает на точный вопрос.)
источник