立即返回特定返回码的 Unix 命令?

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 作为退出代码。在exitreturnshell内建不适合我要找的,因为它们影响调用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

  1. 一个return基于函数会工作,并避免了需要打开和关闭另一个shell,(按照蒂姆·肯尼迪的评论):

    freturn() { return "$1" ; } 
    freturn 56 ; echo $?
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    56
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用exit在子shell:

    (exit 56)
    
    Run Code Online (Sandbox Code Playgroud)

    对于除 之外的外壳ksh93,这意味着分叉一个额外的进程,因此效率低于上述。

  3. bash/ zsh/ksh93只招:

    . <( echo return 56 )
    
    Run Code Online (Sandbox Code Playgroud)

    (这也意味着一个额外的进程(和带有管道的 IPC))。

  4. zsh的 lambda 函数:

    (){return 56}
    
    Run Code Online (Sandbox Code Playgroud)

  • 我有点失望 ?=56 不起作用。 (3认同)
  • @Chris:对于任何 shell 命令,您都可以通过将其转换为 `/bin/sh -c ...originalcommand...` 来使其 execve() 可用 (2认同)

tmh*_*tmh 18

没有用于仅返回特定值的标准 UNIX 命令。GNU的核心Utilies提供truefalse唯一的。

但是,您可以自己轻松地将其实现为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)

  • `true` 和 `false` 也在 Unix(甚至 POSIX)中,不仅在 GNU 中。 (2认同)

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 内置命令,不需要像常规内置命令那样在文件系统中也有该名称的命令,并且大多数系统不会包含一个命令