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


10

有时我正在使用新的(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将变量插入命令的方法,至少在命令的右侧没有。

Answers:


8

当您键入系统中不存在的命令时,bash运行功能command_not_found_handle()。在此功能中,有一个调用/usr/lib/command-not-found脚本来打印消息。

Ubuntu 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行中-yapt-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()

这样,您将在file中获取命令~/.install-missing,因此可以创建别名:

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

如果您致电,im将安装软件包。


嗯,这看起来确实不错,但实际上似乎无法在11.10 oneiric上使用,/usr/lib/command-not-found但没有提及COMMAND_NOT_FOUND_INSTALL_PROMPT-思想?
cwd 2012年

好的,这似乎是12.04精确版的一部分(package-import.ubuntu.com/diffs/command-not-found)。我想我仍然需要较早版本的解决方案。
cwd 2012年

@cwd:我更新了答案...
pbm

3

您在以下方面步入正轨:

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

...但是您缺少sh的选项。考虑:

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

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

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

这行不通。sh和sh -s做同样的事情,在这种情况下至少要这样做。
Deepak Mittal

1

您可以执行以下操作:

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

交互式程序似乎无法很好地与管道系统配合使用,因为在这种情况下,它期望输入为“ Y”,但是一旦第一个命令结束,stdin文件描述符就会关闭。


0

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

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

我愿意证明上述错误。我在Red Hat机器上使用echo命令而不是bash自动提示功能进行测试,但是原理应该是相同的。

归根结底,键入aptitude install git会更快。

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.