如何在没有bash命令替换的情况下执行输出字符串?
例如,如果我输入 Terminal tshark
,并且该程序尚未安装,我将收到如下错误消息:
_some text_
sudo apt-get install tshark
现在我想执行最后一行,无需复制粘贴或转录。
如果我尝试
$ tshark 2> >(tail -1)
sudo apt-get install tshark
我将得到我想要执行的最后一行。
如果我想执行这个字符串,bash 的命令替换当然可以工作并正确安装所有内容:
$ $(tshark 2> >(tail -1))
但是如果我不使用 bash 的命令替换,并将其通过管道传递给 xargs
$ tshark 2> >(tail -1) | xargs
sudo apt-get install tshark
我想知道为什么管道到 xargs 似乎没有效果。
但如果我尝试
$ tshark 2> >(tail -1) | xargs xargs
sudo
提示我密码正确,然后apt-get
在安装与否后中止。
如果我通过管道传输到 ,则会出现相同的结果bash
。
欢迎任何回应或提示。
答案1
回答
您不能重用未显式捕获的命令的输出(管道等),除非您重新执行该命令并自己捕获输出。
Bash 不存储命令输出与它存储命令退出代码和命令历史记录的方式不同。你的终端具有输出,并且 bash 也不会费心为自己保留副本。
因此,如果您想完全避免命令替换,我将得出结论,您无法从这里到达那里。
选项
如果真正的问题是“我怎样才能容易地获取我在终端上面一行中看到的输出,并将其作为命令放入命令提示符中,而无需进行大量输入?”您可以通过几种方式解决这个问题。
- 使用
readline
快捷方式可以更轻松地编辑命令。
例如,您对 @choroba 在其他地方的好建议的回应是,编辑最后一个命令需要输入太多内容。 readline 快捷方式CTRL-a可以CTRL-e使编辑最后一个命令(使用CTRL-p而不是UP向右的 waaaay 到达)更快。
- 使用终端多路复用器,例如
screen
或tmux
。我更喜欢tumx
。复制和粘贴非常轻松,只需简单地CTRL-a CTRL-[跳转到复制模式和几个 VI 键,您就可以将所需的行复制到下一个提示中(使用前导键tmux
进行设置CTRL-a。
希望这能提供一些其他的观点。
答案2
xargs
对从标准输入读取的参数执行您指定的命令。如果未指定命令,则使用echo
.
使用xargs xargs
,第一个 xargs 读取命令并运行
xargs sudo apt-get install tshark
但不再有标准输入,因此不再添加更多参数。但由于没有标准输入,因此也没有对交互式问题的答复 - 他们正在从连接到管道的标准输入读取内容,现在已经耗尽。您可以尝试使用 运行 apt-get --yes
。 (提示输入密码的工作方式与密码相同不是出于安全原因从标准输入读取)。