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


69

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

$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl

现在我知道它的位置了,我想对这个文件做些什么,说编辑它。除了复制/粘贴我命令后面的路径外,还可以使用由find更早版本返回的路径吗?就像可以访问您输入的最后一个参数!$或您使用的最后一个命令一样!!
我已经知道可以使用$?,但它只返回一个错误:0: command not found

$ echo $?
0: command not found

3
这不是返回值,而是输出!
MirandaVeracruzDeLaHoyaCardina

详细地说,“返回值”始终是一个数字。通常,0表示成功,非零表示某种失败。命令吐出的字符串(或文本)称为“输出”,而不是“返回值”。
Michael Dorst

Answers:


33

在命令替换中运行命令:

output=$( find -name '*.wsdl' )
echo "$output"

现在,输出存储在output变量中,您可以随意使用它多次。


10
这不是正确答案。$?是。
mcmlxxxiii

@mcmlxxxiii:$?不包含路径。
choroba

1
抱歉,我return对问题中的术语滥用感到困惑。对于以上问题,您的答案绝对正确。
mcmlxxxiii

4
$?包含最后一个命令的退出状态
Brett Wagner

这就是一直在寻找的答案。我对上一个命令的输出感兴趣,而不是成功/失败返回值。所以谢谢!
约书亚·品特

74

没有特殊的bash变量。

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

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

 find -name  '*.wsdl' -exec emacs {} \;

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

  find -name '*.wsdl' -exec emacs {} +

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

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

result=$(find -name '*.wsdl')
emacs $result

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

  find -name '*.wsdl' | xargs emacs {}

是否可以$?返回其他命令的退出代码?例如ping 1.1.1.1 -w 10; 返回$?
twnaing

1
$?包含前一个命令的退出代码,无论是什么。因此,答案是肯定的。
20:42结束

43

如果您不介意最后一个命令执行两次,那么这是一个快速的技巧,可以以最少的击键完成您想要的操作。

使用反引号,ala:

`!!`

例如

$查找。名称HardToFind.txt
一些/疯狂/路径/到/ HardToFind.txt
$ vim`!!`

*编辑:我看到上面链接的“可能是重复的”问题也包含此答案。仍然直接与此相关,因此将其保留,但对欺骗表示抱歉。


2
非常聪明。我认为这应该是可以接受的答案,因为它解决了在您已经运行命令之前不知道需要输出的最常见情况。
Paul Ruane

1
我同意,这就是我来这里寻找的东西。在前一行执行任何操作均会破坏我的目的,即追溯地决定我要对最后返回的值执行操作。(签出我通过git br | grep我的案例发现的分支)
杰克·凯西

我的最爱之一,这是!认为我每天都这样做。
MetalGodwin

我认为您可以做到这一点非常聪明,但是不确定它确实有用。打字!!比按上键容易吗?然后您仍然可以看到您的命令。如果再次运行该命令是可以接受的,那么我认为只需按一下按钮就一样容易了(并且更加容易理解和透明),
Svend Hesselholt Henne Hansen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.