是否有一个标准的 Unix 命令可以执行与下面的示例类似的操作
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
<cmd here>
应该是可以 fork-execed 的东西,并在进程退出时留下 56 作为退出代码。exit
和shell 内置函数return
不适合我正在寻找的内容,因为它们通过退出来影响调用 shell 本身。<some cmd>
应该是我可以在非 shell 上下文中执行的东西 - 例如,使用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 命令可以为我做到这一点。
答案1
基于函数
return
可以工作,并且避免需要打开和关闭另一个 shell,(根据蒂姆·肯尼迪的评论):freturn() { return "$1" ; } freturn 56 ; echo $?
输出:
56
exit
在子 shell 中使用:(exit 56)
对于除 之外的 shell
ksh93
,这意味着分叉一个额外的进程,因此效率低于上述进程。bash
//唯一zsh
的ksh93
技巧:. <( echo return 56 )
(这也意味着一个额外的进程(以及带有管道的 IPC))。
zsh
的 lambda 函数:(){return 56}
答案2
不存在仅返回特定值的标准 UNIX 命令。 GNU Core Utilities 提供true
且false
仅提供。
但是,您可以自己轻松地实现这一点ret
:
#include <stdlib.h>
int main(int argc, char *argv[]) {
return argc > 1 ? atoi(argv[1]) : 0;
}
编译:
cc ret.c -o ret
并运行:
./ret 56 ; echo $?
印刷:
56
如果您需要它在任何地方都可以工作(也就是说,在 bash 可用的地方)而不安装任何额外的工具,您可能需要使用以下命令,如 @TimKennedy 在评论中建议的那样:
bash -c 'exit 56'
请注意,返回值的有效范围为 0..255(含)。
答案3
如果您需要通过执行的命令设置退出状态。没有专门的命令1,但您可以使用任何能够以任意退出状态退出的语言的解释器。sh
是最明显的一个:
sh -c 'exit 56'
对于大多数sh
实现,这仅限于退出代码 0 到 255(sh
将接受更大的值,但可能会截断它,甚至导致将信号发送到正在执行的进程,sh
就像使用 ksh93 处理代码 257 到 320 一样)。
退出代码可以是任何整数 ( int
) 值,但请注意,您需要使用接口检索它waitid()
,以便该值不会被截断为 8 位(waitid()
但在 Linux 上,它仍然会被截断)。因此,为什么很少(而且不是一个好主意)使用高于 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
1exit
是执行此操作的标准命令,但作为 shell特别内置,不需要像常规内置命令一样在文件系统中也有一个具有该名称的命令,并且大多数系统不会包含一个
答案4
我不确定该exit
命令的唯一问题是否是退出当前 shell,但如果是这样,子 shell 可能会起作用。
username@host$ $(exit 42)
username@host$ echo $?
42
我刚刚在 Cygwin Bash 上测试了这个,它对我有用。
编辑:抱歉,我错过了在 shell 上下文之外运行它的部分。在这种情况下,如果不将其包装在.sh
脚本中并从您的环境中执行它,这将无济于事。