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

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

简单场景:我正在寻找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

答案1

没有针对此问题的特殊 bash 变量。

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

您可以将标志的输出find与该-exec标志一起使用,如下所示:

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

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

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

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

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

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

这适用于所有命令,而不仅仅是 find。不过你也可以使用xargs

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

答案2

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

使用反引号,ala:

`!!`

例如

$ find .-name HardToFind.txt
一些/疯狂/路径/到/HardToFind.txt
$ vim`!!`

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

答案3

在命令替换中运行命令:

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

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

echo "$output"

答案4

`!!`是一个很好的解决方案,但如果您想要更快,您可以使用别名。

不幸的是它不起作用:

~$ alias test='echo `!!`'
~$ test
zsh: command not found: !!

因此,请使用`fc -e -` 我使用的示例别名:

复制输出:

alias co='echo `fc -e -` | xclip -in -selection clipboard'

用 vim 打开;如果输出有很多行,则在选项卡中打开所有行:

alias vo='vim -p `fc -e -`'

相关内容