有时我正在开发一个新的(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) 更改stderr
为stdout
.为此,请编辑文件/usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
并更改stderr
为stdout
第 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 会更快...