Unix, которая сразу же возвращает код возврата?

Есть ли стандартная команда Unix, которая делает что-то похожее на мой пример ниже

$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$

<cmd here> должен быть чем-то, что может быть fork-execed, и оставляет 56 в качестве кода выхода при выходе из процесса. Строки оболочки exit и return непригодны для чего я ищу, потому что они влияют на вызывающую оболочку, выходя из нее. <some cmd> должен быть чем-то, что я могу выполнить в контекстах без оболочки - например, вызывать из скрипта Python с помощью subprocess

Например, /usr/bin/false всегда выходит сразу с кодом возврата 1, но я хотел бы точно контролировать, что это за код возврата. Я мог бы добиться тех же результатов, написав собственный сценарий оболочки

$ cat my-wrapper-script.sh # i.e., <some cmd> = ./my-wrapper-script.sh
#!/usr/bin/bash
exit $1
$ ./my-wrapper-script.sh 56
$ echo $?
56

, но я надеюсь, что существует стандартная команда Unix, которая может сделать это для меня.

25 голосов | спросил Chris 10 +03002016-10-10T05:51:50+03:00312016bEurope/MoscowMon, 10 Oct 2016 05:51:50 +0300 2016, 05:51:50

4 ответа


17

Нет стандартной команды UNIX для простого возврата определенного значения. Утилиты GNU Core предоставляют true и false только.

Однако вы можете легко реализовать это как ret:

#include <stdlib.h>
int main(int argc, char *argv[]) {
  return argc > 1 ? atoi(argv[1]) : 0;
}

Compile:

cc ret.c -o ret

И запустите:

./ret 56 ; echo $?

Печать

56

Если вам нужно, чтобы это работало везде (где доступно bash, то есть), без установки каких-либо дополнительных инструментов, вам, вероятно, придется прибегнуть к следующей команде, как @TimKennedy, предлагаемой в комментариях:

bash -c 'exit 56'

Обратите внимание, что допустимый диапазон возвращаемых значений - 0..255 включительно .

ответил tmh 10 +03002016-10-10T14:32:42+03:00312016bEurope/MoscowMon, 10 Oct 2016 14:32:42 +0300 2016, 14:32:42
14

Если вам нужен статус выхода, который должен быть установлен исполняемыми командами. Для этой 1 нет выделенной команды, но вы можете использовать интерпретатор любого языка, который имеет возможность выйти с произвольным статусом выхода. sh является наиболее очевидным:

sh -c 'exit 56'

В большинстве реализаций sh, которые ограничены кодами выхода от 0 до 255 (sh будет принимать более высокие значения, но может усечь его или даже вызвать отправку сигнала в процесс, выполняющий sh как с ksh93 для кодов с 257 по 320).

Код выхода может быть любым целым числом (int), но обратите внимание, что вам нужно получить его с помощью waitid(), поэтому значение не усекается до 8 бит (в Linux он по-прежнему усечен с помощью waitid(), хотя). Отсюда почему редко (и не очень хорошая идея) использовать коды выхода выше 255 (используйте для нормальной работы 0-123).

В качестве альтернативы:

awk 'BEGIN{exit 56}'
perl -e 'exit 56'
python -c 'exit(56)'
expect -c 'exit 56'

(эти коды не обрезают код выхода до 8 бит).

С NetBSD find вы можете сделать:

find / -exit 56

1 exit является стандартной командой для этого, но является оболочкой специальный встроенный , нет требования, чтобы в файловой системе также была команда с таким именем, как для обычных встроенных модулей, и большинство систем не будут включать один

ответил Stéphane Chazelas 10 +03002016-10-10T15:02:23+03:00312016bEurope/MoscowMon, 10 Oct 2016 15:02:23 +0300 2016, 15:02:23
3
/* Public domain, http://creativecommons.org/publicdomain/zero/1.0/ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv) {
    if(!strcasecmp(argv[0],"true")) return 0;
    else if (!strcasecmp(argv[0],"false")) return 1;
    else if(argc<2) {fputs("One argument required\n",stderr);return 1;}
    else if(!strcasecmp(argv[argc-1],"true")) return 0;
    else if(!strcasecmp(argv[argc-1],"false")) return 1;
    else return atoi(argv[argc-1]);
}

Сохраните это в файле с именем returncode.c и gcc -o returncode returncode.c

ответил ThePiercingPrince 10 +03002016-10-10T18:59:15+03:00312016bEurope/MoscowMon, 10 Oct 2016 18:59:15 +0300 2016, 18:59:15
0

Я не был точно уверен, что ваша единственная проблема с командой exit заключалась в выходе из текущей оболочки, но если это так , подоболочка могла бы работать.

[email protected]$ $(exit 42)
[email protected]$ echo $?
42

Я тестировал это на Cygwin Bash только сейчас, и он работает для меня.

Изменить: Извините, я пропустил часть запуска его вне контекста оболочки. В этом случае thsi не поможет, не обернув его в сценарий .sh и выполнив это из вашей среды.

ответил Mihir 10 +03002016-10-10T18:45:58+03:00312016bEurope/MoscowMon, 10 Oct 2016 18:45:58 +0300 2016, 18:45:58

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132