Chr*_*ris 34 command-line shell exit-status
是否有一个标准的 Unix 命令可以执行类似于我下面的示例的操作
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
Run Code Online (Sandbox Code Playgroud)
<cmd here>
应该是可以 fork-execed 的东西,并在进程退出时留下 56 作为退出代码。在exit
和return
shell内建不适合我要找的,因为它们影响调用shell本身它退出了。<some cmd>
应该是我可以在非 shell 上下文中执行的东西 - 例如,从 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
Run Code Online (Sandbox Code Playgroud)
但我希望碰巧存在一个标准的 Unix 命令可以为我做到这一点。
agc*_*agc 43
一个return
基于函数会工作,并避免了需要打开和关闭另一个shell,(按照蒂姆·肯尼迪的评论):
freturn() { return "$1" ; }
freturn 56 ; echo $?
Run Code Online (Sandbox Code Playgroud)
输出:
56
Run Code Online (Sandbox Code Playgroud)使用exit
在子shell:
(exit 56)
Run Code Online (Sandbox Code Playgroud)
对于除 之外的外壳ksh93
,这意味着分叉一个额外的进程,因此效率低于上述。
bash
/ zsh
/ksh93
只招:
. <( echo return 56 )
Run Code Online (Sandbox Code Playgroud)
(这也意味着一个额外的进程(和带有管道的 IPC))。
zsh
的 lambda 函数:
(){return 56}
Run Code Online (Sandbox Code Playgroud)tmh*_*tmh 18
没有用于仅返回特定值的标准 UNIX 命令。GNU的核心Utilies提供true
和false
唯一的。
但是,您可以自己轻松地将其实现为ret
:
#include <stdlib.h>
int main(int argc, char *argv[]) {
return argc > 1 ? atoi(argv[1]) : 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:
cc ret.c -o ret
Run Code Online (Sandbox Code Playgroud)
并运行:
./ret 56 ; echo $?
Run Code Online (Sandbox Code Playgroud)
印刷:
56
Run Code Online (Sandbox Code Playgroud)
如果您需要它在任何地方(在 bash 可用的地方)工作而无需安装任何额外的工具,您可能需要按照@TimKennedy 在评论中的建议使用以下命令:
bash -c 'exit 56'
Run Code Online (Sandbox Code Playgroud)
请注意,返回值的有效范围是 0..255(包括 0..255)。
Sté*_*las 14
如果您需要通过执行的命令设置退出状态。1没有专门的命令,但您可以使用任何能够以任意退出状态退出的语言的解释器。sh
是最明显的:
sh -c 'exit 56'
Run Code Online (Sandbox Code Playgroud)
对于大多数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'
Run Code Online (Sandbox Code Playgroud)
(那些不会将退出代码截断为 8 位)。
使用 NetBSD find
,您可以:
find / -exit 56
Run Code Online (Sandbox Code Playgroud)
1exit
是执行此操作的标准命令,但作为一个特殊的 shell 内置命令,不需要像常规内置命令那样在文件系统中也有该名称的命令,并且大多数系统不会包含一个命令