/bin/true

/bin/true

是否有一个标准的虚拟可执行文件在 Linux 中不执行任何操作?我有一个 shell 命令,它总是在构建过程之前打开 $EDITOR 以手动输入参数。就我而言,我的参数始终已设置(这是一个自动脚本),因此我从不需要它,但它仍然会弹出并等待用户输入。

为了解决这个问题,我创建了一个不执行任何操作的空可执行文件,因此我可以设置EDITOR=dummy并且构建脚本调用它,它退出并且构建过程可以启动。

我的问题是,Linux 中是否有一个现有的官方文件,在执行时什么也不做,是一种我可以用于此目的的占位符?

答案1

有标准实用程序truefalse.第一个什么也不做,只是返回退出状态 0 表示成功执行,第二个不执行任何操作,只是返回一个非零值,表示结果不成功(*)。你可能想要第一个。

尽管某些确实希望您输入一些文本(提交消息等)的系统会检查“编辑的”文件是否确实被修改,但true在这种情况下仅仅运行是行不通的。相反,touch可能会起作用;它更新作为参数获取的任何文件的时间戳

但是,如果编辑器获取文件名以外的任何其他参数,touch则会将它们创建为文件。许多编辑器支持一个参数,比如告诉第一行将光标放入,因此编辑器可以被称为. (例如,这样做,似乎没有。)+NNN$EDITOR +123 filename.txtlessgit


请注意,您需要使用true,而不是例如/bin/true。首先,如果涉及 shell,则指定不带路径的命令将允许 shell 使用内置实现,如果不使用 shell,则无论如何都会找到二进制文件PATH。其次,并非所有系统都有/bin/true;例如,在 macOS 上,它是/usr/bin/true. (谢谢@jpaugh。)

(* 或作为GNU 手册页指出, false “[不执行]任何操作,不成功”。谢谢@8bittree。)

答案2

在 shell 中,您可以使用内置的:.它不是可执行文件,但在 shell 脚本或从 shell 脚本执行的任何内容中,它会执行以下操作:

$ help :
:: :
    Null command.
     
    No effect; the command does nothing.
     
    Exit Status:
    Always succeeds.

这可能最著名的是在 while 语句 ( while :; do break; done) 中使用,但不限于这种使用。如果您需要多次执行此操作,则不启动单独的进程会更快:

$ time for i in $(seq 1000); do :; done

real    0m0,007s
user    0m0,002s
sys     0m0,004s
$ time for i in $(seq 1000); do /bin/true; done

real    0m0,686s
user    0m0,462s
sys     0m0,217s

答案3

@ilkkachu 使用该true命令的建议可能是最好的答案,但您也可以使用该命令

sleep 0

答案4

/bin/true

true没有成功执行任何操作。

false尝试什么也不做,但失败了。

/bin/true它们在和中实现/bin/false

但因为有时快速什么都不做也很好,所以还有一个内置的 shell true。有时您希望快速地什么都不做而失败,因此有一个内置的 shell false

成功和失败的区别在于退出状态$?。这是0为了成功,而不是为了失败。退出状态1用于简单地指示失败,但它可以是错误代码,可以254详细解释出现的问题。

$ true
$ echo $?
0
$ false
$ echo $?
1
$ false
$ echo $?
1
$ echo $?
0

请注意最后一个如何echo返回0,因为echo前面的它成功了。

退出状态与逻辑运算符一起使用,例如“and”( &&) 和“or”( ||):

$ true && echo "success"
success
$ false && echo "failure"
$ true || echo "success"
$ false || echo "failure"
failure

请注意 afterfalse && echo "failure"true || echo "success"没有打印任何内容。

相关内容