在命令行中从 tail 执行文本的最简单方法是什么?

在命令行中从 tail 执行文本的最简单方法是什么?

有时我正在开发一个新的(ubuntu)盒子,我输入git并收到警报:

The program 'git' is currently not installed.  You can install it by typing:
apt-get install git-core

如果发生这种情况,我知道我可以通过执行以下操作来获取最后一行:

!! 2>&1 | tail -n 1

apt-get install git-core但我怎样才能最轻松地执行 ( ) 的结果呢?

我意识到我可以做到

`!! 2>&1 | tail -n 1`

但是否还有一种方法可以实际通过管道输出并运行它?这似乎不起作用:

!! 2>&1 | tail -n 1 | sh

另外,这2>&1部分有点麻烦,所以我很好奇是否有更简单的方法来实现这一点。

编辑

以某种方式将其保存到变量中,然后执行该变量也是可以接受的:

!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd

但我不确定我stdout是否知道通过管道输入变量的方法,至少不知道变量位于命令的右侧。

答案1

当您键入系统中不存在的命令时,bash 会运行 function command_not_found_handle()。在此函数中调用/usr/lib/command-not-found打印消息的脚本。

乌班图12.04

我的第一个猜测是更改此脚本的源以打印消息,stdout但是stderr当我阅读脚本的源时,我发现您可以将其配置为仅询问您是否要安装丢失的软件包。

如果您导出变量,COMMAND_NOT_FOUND_INSTALL_PROMPT系统会要求您安装缺少的包:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm: 

旧版本的 Ubuntu

不幸的是没有COMMAND_NOT_FOUND_INSTALL_PROMPT,所以我可以找到一些其他选择:

1)从 12.04 安装包 - 这不应该是问题 - 它只是 Python 中的几个脚本,所以它应该可以工作(未经测试!)。

2) 更改stderrstdout.为此,请编辑文件/usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py并更改stderrstdout第 237 行和第 240 行。

之后你可以这样使用它:

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins

如果您在第 237 行和第 240 行中-y向命令添加选项,apt-get您还可以使用语法!! | sh

3) 你也可以从第242行开始修改这个脚本:

print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()

通过这种方式,您将在文件中获取命令~/.install-missing,因此您可以创建别名:

alias im="chmod +x ~/.install-missing; ~/.install-missing"

如果你调用im包将会被安装。

答案2

您走在正确的轨道上:

!! 2>&1 | tail -n 1 | sh

...但你缺少一个选择。考虑:

!! 2>&1 | tail -n 1 | sh -s

由于您可能需要 root 访问权限才能运行 apt-get,请考虑:

!! 2>&1 | tail -n 1 | sudo sh -s

答案3

你可以这样做:

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

交互式程序似乎不能很好地与管道一起工作,因为它需要一个输入,在本例中为“Y”,但是一旦第一个命令结束,stdin 文件描述符就会关闭。

答案4

我相信您可以使用变量eval和命令替换(尽管我不确定这一切有多安全):

TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR

我愿意被证明上述观点是错误的。我正在 Red Hat 机器上使用echo命令而不是 bash 完成自动建议对此进行测试,但原理应该是相同的。

归根结底,只需输入 aptitude install git 会更快...

相关内容