是否有一个标准的虚拟可执行文件在 Linux 中什么都不做?

Bel*_*val 47 linux command-line

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

为了解决这个问题,我创建了一个空的可执行文件,它什么都不做,所以我可以设置EDITOR=dummy和构建脚本调用它,它退出并且构建过程可以开始。

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

ilk*_*chu 121

有标准的实用程序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 手册页所说的那样,错误的“[做] 什么也不成功”。谢谢@8bittree。)

  • 该标准允许 `true` 和 `false` 成为 shell 内置函数,但它也要求命令在标准搜索 `PATH` 中作为可执行文件可用。 (21认同)
  • @HaukeLaging,是的......在实践中。构建过程或任何可能不会通过 shell 运行的过程,因此它最终会从路径中选择 `/bin/true`。或者,如果它选择内置的 shell,这并不重要。但是,如果我理解正确的话,标准并没有真正定义它必须专门作为`/bin/true` 找到。 (11认同)
  • 那必须是`/bin/true`。否则,它通常是一个内置的 shell,它并不是真正的“标准虚拟可执行文件”。 (7认同)
  • 我确实喜欢“true”的(Gnu)联机帮助页:“什么都不做,成功”和“false”:“什么都不做,不成功”。这不意味着 `false` 实际上确实做了一些事情吗?(需要说明的是,这是一个反问句。我的理解是 `false` 只会以非零状态退出。) (7认同)
  • 在 SysV Unix 中,/bin/true 是一个只包含版权注释的 shell 脚本。不知道他们有什么版权... (6认同)

ger*_*rit 27

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

$ help :
:: :
    Null command.
     
    No effect; the command does nothing.
     
    Exit Status:
    Always succeeds.
Run Code Online (Sandbox Code Playgroud)

这可能因在 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
Run Code Online (Sandbox Code Playgroud)

  • @JanHudec 正确,因为`exec` 用于启动一个新进程。可能出于 OP 的特定目的,只有 `/bin/true` 会起作用;但是对于以后发现这个问题的其他人来说,可能是 shell 内置的 `:` 更合适。 (4认同)
  • `:` 在很多情况下 * 不会* 工作,因为它期望 `exec` 某些东西。不过,`/bin/true` 会。 (3认同)
  • @ilkkachu:有`posix_spawn`(尽管除了嵌入式系统,您可能希望它是结合 fork/vfork/clone 和 execve 的包装器)。此外,仍然处于迂腐模式,shell `exec` 可以做除执行文件之外的其他事情(它改变当前进程的 fd)。 (2认同)