Есть ли стандартная команда Unix, которая делает что-то похожее на мой пример ниже
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
<cmd here>
должно быть чем-то, что может быть обработано ветвлением и оставляет 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, которая может сделать это для меня.
exit
это единственный, о котором я могу думать, но это имеет тенденцию заканчивать вашу оболочку.bash -c 'exit 56'
илиbash -c "exit $1"
может работать на вас.(exit 56)
?true
иfalse
встроенные модули , если вам нужно возвратить 0 или 1.Ответы:
return
Функция , основанная будет работать, и избавляет от необходимости открывать и закрывать другую оболочку, (согласно Тим Кеннеди комментарий «s ):Выход:
используя
exit
в подоболочке:Для оболочек, отличных от
ksh93
, это подразумевает разветвление дополнительного процесса, поэтому он менее эффективен, чем выше.bash
/zsh
/ksh93
Трюк:(это также подразумевает дополнительный процесс (и IPC с каналом)).
zsh
лямбда-функции:источник
<some cmd>
это была execve () - способная вещь./bin/sh -c ...originalcommand...
Не существует стандартной команды UNIX для простого возврата определенного значения. Утилиты GNU Core предоставляют
true
иfalse
только.Тем не менее, вы можете легко реализовать это самостоятельно как
ret
:Обобщение:
И запустить:
Печать:
Если вам нужно, чтобы это работало везде (где есть bash, то есть без установки каких-либо дополнительных инструментов), вам, вероятно, нужно прибегнуть к следующей команде, как предложено в комментариях @TimKennedy:
Обратите внимание, что допустимый диапазон возвращаемых значений составляет 0..255 включительно .
источник
true
иfalse
в Unix (и даже POSIX), а не только в GNU.Если вам нужно, чтобы состояние выхода было установлено выполненными командами. Для этого 1 нет выделенной команды , но вы можете использовать переводчик любого языка, который имеет возможность выхода с произвольным статусом выхода.
sh
является наиболее очевидным:В большинстве
sh
реализаций это ограничено кодами выхода от 0 до 255 (sh
будет принимать большие значения, но может усекать его или даже вызывать отправку сигнала процессу, выполняющемусяsh
подобно ksh93 для кодов с 257 по 320).Код выхода может быть любым значением integer (
int
), но имейте в виду, что вам нужно получить его с помощьюwaitid()
интерфейса, чтобы значение не было усечено до 8 бит (waitid()
хотя в Linux оно все еще усекается ). Следовательно, почему редко (и не очень хорошая идея) использовать коды выхода выше 255 (используйте 0-123 для нормальной работы).В качестве альтернативы:
(они не усекают код выхода до 8 бит).
С NetBSD
find
вы можете сделать:1
exit
- это стандартная команда, которая делает это, но, будучи специальной встроенной оболочкой , не требуется, чтобы в файловой системе была команда с таким именем, как для обычных встроенных команд, и большинство систем не будет включать ееисточник
Сохраните это в файле с именем
returncode.c
иgcc -o returncode returncode.c
источник
argv[argc-1]
вместоargv[1]
, и почему вы не жалуетесь, еслиargc>2
. (2) Я был бы склонен сделатьargv[1]
тест передargv[0]
тестом, позволяя пользователю сказатьtrue 56
илиfalse 56
вместоreturncode 56
. Вы не даете сообщение, еслиargv[0]
это слово иargc>0
- это может сбить с толку. (3) Я одержим удобством использования, поэтому я бы использовалstrcasecmp
вместоstrcmp
. (4) Я склонен проверять параметры, а не использовать возвращаемое значениеatoi
без его проверки. Для 2-ой программы, как эта, я думаю, это не имеет значения.true
неfalse
обрабатывает аргументы в системах Linuxargv[0]
; программы/bin/true
и/bin/false
разные исполняемые файлы, с жестко закодированными кодами выхода. Вы написали программу , которая может быть установлена , как иtrue
иfalse
(связанную), который является умным. Но вопрос состоит в том, как получить указанный пользователем статус выхода. Ваша программа отвечает на этот вопрос, но только если она установлена под другим именем файла. Пока вы смотрите вargv
любом случае, я полагаю, что выполнение того, что я предлагаю, поддержало бы уровень хитрости, избегая необходимости в третьей ссылке.Я не был уверен, что ваша единственная проблема с
exit
командой - выход из текущей оболочки, но если это так, то подоболочка может работать.Я только что проверил это на Cygwin Bash, и оно работает для меня.
Изменить: Извините, я пропустил часть запуска его вне контекста оболочки. В этом случае это не помогло бы, если бы вы не поместили его в
.sh
скрипт и не выполнили его из вашей среды.источник
$(exit 42)
пытается выполнить выводexit 42
в виде простой команды, которая не имеет смысла (она также не будет работать сyash
).(exit 42)
(также запускаетсяexit
в подоболочке, но оставляет свои выходные данные в покое) более логичным и более переносимым (даже для csh или оболочки Bourne).