如何访问bash中的最后一个返回值?

Ant*_*nto 94 bash

简单场景:我正在寻找wsdl在项目中丢失的文件。

$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl
Run Code Online (Sandbox Code Playgroud)

现在我知道它在哪里,我想对这个文件做一些事情,比如编辑它。是否可以使用find较早返回的路径,而不是复制/粘贴我的命令后面的路径?就像可以访问您输入的最后一个参数!$或使用!!.
我已经读到可以使用$?,但它只会返回一个错误:0: command not found

$ echo $?
0: command not found
Run Code Online (Sandbox Code Playgroud)

ahi*_*end 92

没有特殊的 bash 变量。

$? 包含最后一条命令的退出代码(0 = 成功,>0 = 错误代码)

您可以使用find带有-exec标志的输出,如下所示:

 find -name  '*.wsdl' -exec emacs {} \;
Run Code Online (Sandbox Code Playgroud)

{}替换为由 找到的文件名find。这将为每个找到的文件执行命令。如果要使用所有找到的文件作为参数执行命令,请使用 a +at teh end ,如下所示:

  find -name '*.wsdl' -exec emacs {} +
Run Code Online (Sandbox Code Playgroud)

这将打开一个 emacs 实例,并在其中打开所有找到的 .wsdl 文件。

更通用的解决方案是将输出存储在变量中:

result=$(find -name '*.wsdl')
emacs $result
Run Code Online (Sandbox Code Playgroud)

这适用于所有命令,而不仅仅是查找。虽然您可能还会使用xargs

  find -name '*.wsdl' | xargs emacs {}
Run Code Online (Sandbox Code Playgroud)

  • `$?` 包含上一个命令的退出代码,无论它是什么。所以,答案是肯定的。 (2认同)

小智 54

如果您不介意最后一个命令执行两次,这里有一个快速的 hack 方法,可以用最少的击键完成您想要的操作。

使用反引号,ala:

`!!`

例如

$ 查找。-name HardToFind.txt
some/crazy/path/to/HardToFind.txt
$ vim`!!`

*编辑:我看到上面链接的“可能被骗”的问题也包含这个答案。仍然与这个直接相关,所以离开它,但对受骗感到抱歉。

  • 非常聪明。我认为这应该是公认的答案,因为它解决了最常见的情况,即在您已经运行命令之前不知道您需要输出。 (3认同)

cho*_*oba 41

在命令替换中运行命令:

output=$(find -name '*.wsdl')
Run Code Online (Sandbox Code Playgroud)

输出现在存储在output变量中,您可以使用以下命令多次使用该变量:

echo "$output"
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个正确的答案。$? 是。 (17认同)
  • `$?` 包含最后一条命令的退出状态 (7认同)
  • @mcmlxxxiii:`$?` 不包含路径。 (4认同)
  • 抱歉,我对问题中“返回”一词的滥用感到困惑。您对上述问题的回答完全正确。 (3认同)