Як отримати список кодів виходу (та / або повернення кодів) та значення команди / утиліти?


17

Чи є спосіб я зробити те, що зазначено в заголовку, з команд термінала, або мені доведеться заглянути в коди?

Відповіді:


15

Немає "рецепту" для отримання значень стану виходу даної термінальної команди.

Моєю першою спробою буде введення сторінки:

user@host:~# man ls 
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

Друге : Google . Дивіться wget як приклад.

Третє : статуси виходу оболонки, наприклад bash. Bash і його вбудовані можуть спеціально використовувати значення вище 125. 127 для команди не знайдено, 126 для команди не виконується. Для отримання додаткової інформації дивіться коди виходу bash .


так, якась людина, інформація, ... сторінки включають їх .. і я стосувався тих, хто цього не зробив. ..і я знаю, що веб-дослідження - це завжди варіант. ..а поки що, здається, що мені довелося шукати тільки вихідні коди виходу ..
точно

12

Вихідні коди вказують на стан відмови під час завершення програми, і вони падають між 0 і 255. Оболонка та її вбудовані можуть використовувати особливо значення вище 125 для позначення конкретних режимів відмови, тому список кодів може змінюватись між оболонками та операційними системами (наприклад, Bash використовує значення 128 + N як статус виходу). Див.: Bash - 3.7.5 Вихід стану або man bash.

Взагалі статус нульового виходу вказує на те, що команда успішна , ненульовий статус виходу вказує на збій .

Щоб перевірити, який код помилки повертається командою, ви можете надрукувати $?останній код виходу або ${PIPESTATUS[@]}який дає список значень статусу виходу з конвеєра (на Bash) після виходу сценарію оболонки.

Немає повного списку всіх кодів виходу, які можна знайти, проте була спроба систематизувати номери статусу виходу у джерелі ядра, але це головне, призначене для програмістів C / C ++ і подібний стандарт для сценаріїв може бути доречним.

Деякий список сисекситів як для Linux, так і для BSD / OS X з переважними кодами виходу програм (64-78) можна знайти в /usr/include/sysexits.h(або: man sysexitsна BSD):

0   /* successful termination */
64  /* base value for error messages */
64  /* command line usage error */
65  /* data format error */
66  /* cannot open input */
67  /* addressee unknown */
68  /* host name unknown */
69  /* service unavailable */
70  /* internal software error */
71  /* system error (e.g., can't fork) */
72  /* critical OS file missing */
73  /* can't create (user) output file */
74  /* input/output error */
75  /* temp failure; user is invited to retry */
76  /* remote error in protocol */
77  /* permission denied */
78  /* configuration error */
/* maximum listed value */

Вищенаведений список виділяє раніше не використані коди виходу з 64-78. Діапазон необмежених кодів виходу буде надалі обмежений.

Однак вищезгадані значення в основному використовуються у sendmail і використовуються майже ніким, тому вони не є чимось віддаленим від стандарту (як вказував @Gilles ).

У оболонці статус виходу такий (на основі Bash):

  • 1- 125- Команда не завершилася успішно. Ознайомтеся зі сторінкою команди команди на значення статусу, кілька прикладів нижче:

  • 1 - Catchall для загальних помилок

    Різні помилки, такі як "ділити на нуль" та інші неприпустимі операції.

    Приклад:

    $ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    
  • 2 - Неправильне використання вбудованих оболонок (згідно документації Bash)

    Відсутнє ключове слово чи команда, або проблема дозволу (і різний код повернення при невдалому порівнянні бінарних файлів).

    Приклад:

     empty_function() {}
    
  • 6 - Немає такого пристрою чи адреси

    Приклад:

    $ curl foo; echo $?
    curl: (6) Could not resolve host: foo
    6
    
  • 124 - тайм-аут команди

  • 125- якщо сама команда не вдається переглянути: coreutils
  • 126 - якщо команда знайдена, але її не можна викликати (наприклад, не виконується)

    Проблема або команда дозволу не є виконуваним.

    Приклад:

    $ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    
  • 127 - якщо команду неможливо знайти, дочірній процес, створений для її виконання, повертає цей статус

    Можлива проблема $PATHабо помилка друку.

    Приклад:

    $ foo; echo $?
    -bash: foo: command not found
    127
    
  • 128 - Недійсний аргумент на exit

    вихід приймає лише цілі аргументи в діапазоні 0 - 255.

    Приклад:

    $ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    
  • 128- 254- сигнал фатальної помилки "n" - команда загинула через отримання сигналу. Код сигналу додається до 128 (128 + SIGNAL), щоб отримати статус (Linux:, man 7 signalBSD:) man signal, кілька прикладів нижче:

  • 130 - команда припиняється через натискання Ctrl-C, 130-128 = 2 (SIGINT)

    Приклад:

    $ cat
    ^C
    $ echo $?
    130
    
  • 137- якщо команда надсилає KILL(9)сигнал (128 + 9), стан виходу команди в іншому випадку

    kill -9 $PPID сценарію.

  • 141- SIGPIPE- пишіть на трубі без читача

    Приклад:

    $ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
    $ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
    xargs: cat: terminated by signal 13
    $ echo ${PIPESTATUS[@]}
    0 125 141
    
  • 143 - команда, що припиняється за сигнальним кодом 15 (128 + 15 = 143)

    Приклад:

    $ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    
  • 255* - статус виходу за межі діапазону.

    вихід приймає лише цілі аргументи в діапазоні 0 - 255.

    Приклад:

    $ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    

Згідно з наведеною вище таблицею, коди виходу 1 - 2, 126 - 165 та 255 мають особливі значення, і тому слід уникати вказаних користувачем параметрів виходу.

Зверніть увагу, що значення поза виходом із діапазону можуть призвести до несподіваних кодів виходу (наприклад, вихід 3809 дає код виходу 225, 3809% 256 = 225).

Побачити:


errnoЗначення використовуються системними API, вони не використовуються як статуси виходу (вони навіть не в потрібному діапазоні) і не мають значення для сценаріїв оболонок. Значення сисекситів - від sendmail і використовуються майже ніхто інший, вони нічим не віддалені від стандартних.
Жил "ТАК - перестань бути злим"

7

Вам доведеться переглянути код / ​​документацію. Однак річ, яка найбільше наближається до "стандартизації", - це errno.h


спасибі за вказівку на файл заголовка .. спробував вивчити документацію кількох утиліт .. важко знайти коди виходу, здається, більшість буде стримерів ...
точно

3
errno.hне має значення, коли мова заходить про вихідні коди, лише повідомлення про помилки.
Жил "ТАК - перестань бути злим"

Більшість програм повертають коди виходу відповідно до конвенції BSD, як викладено у sysexits.h. Однак деякі програми повертають errnos, і я фактично думаю, що повернення errnos має найбільш сенс. Нерозроблені errnos поширюються вгору, як винятки, ( errnoповернення, функції повертаються, наприклад, -1або 0|NULL). Оскільки програми - це лише функції, хоча функції, які виконуються в окремому просторі адреси, має сенс, що програма може захотіти продовжувати errnoпоширення через межу процесу.
PSkocik

@PSkocik, чи є у вас приклад такої команди? errnos не є портативним (значення не відповідають усім системам), і немає портативного способу отримання імені помилки або повідомлення від значення (zsh має для цього вбудований). Не кажучи вже про те, що деякі системи мають errnos вище 123, що зіткнеться із загальними кодами помилок зі спеціальним значенням . Зазвичай команди друкують повідомлення з програми errno і повертають статус успішного / невдалого виходу. команди призначені для користувачів. функції / системні виклики призначені для програмістів.
Стефан Шазелас

@ StéphaneChazelas Я бачив це кілька разів, але не в жодних усталених програмах, маю визнати. Останнім часом я особисто повертаю errno + 1 у своїй іграшковій системі (так що 1 продовжує означати "будь-яку помилку"), тому що я думаю, що серіалізація errno через межі процесу має кращий сенс, ніж переклад відповідно до конвенції BSD, оскільки виконання програм по суті, виклики функцій, а функції використовують errno. Я використовую власний декодер останнього виходу у своєму PROMPT_COMMAND (bash), щоб отримати щось подібне "($numeric_code|$bsd_decoded|$errno_plus_one_decoded)".
PSkocik

1

Наскільки я знаю, є лише два, більш-менш-менш, стандартних значення - обидва визначені stdlib.hдля використання з exit ():

  • EXIT_SUCCESS (= 0)
  • EXIT_FAILURE (= 1)

І єдине фактичне стандартне значення, тобто таке, що має однакове значення для всіх програм у світі, - 0 (нуль), що означає УСПІХ.

Різні програми вводять різні списки повернених "невдач" -кодів, щоб розрізнити або підкреслити різні помилки (різного типу або тяжкості). Деякі програми навіть використовують повернене значення, щоб повідомити про цілу кількість виявлених помилок виконання (наприклад, кількість невдалих одиничних тестів у костюмі).

Я б не рекомендував вводити будь-який "новий стандарт", що розширює stdlib.h

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.