可能的重复:
在命令行中从 tail 执行文本的最简单方法是什么?
我猜测未能执行的命令的输出应该发送到标准输出,因此可以通过管道传输。看来我错了,所以请纠正我。
例如,
$easy_install
The program 'easy_install' is currently not installed. You can install it by typing:
sudo apt-get install python-setuptools
因此,如果我想使用建议的命令进行安装,我尝试过
$easy_install | grep sudo | bash
即天真地尝试挑选最后一行并将其作为命令发送到 shell。我什至尝试过
$easy_install | tail -1 | bash
但得到同样的简介却没有做任何事情。我究竟做错了什么?
答案1
由于有问题的行是命令,我能想到的最简单的方法是:
`$easy_install 2>&1 | grep sudo`
反引号或$(…)
获取命令管道的输出并执行它,就像您键入它一样,返回输出。
sudo
请注意,如果您丢失并尝试安装该命令,则该命令将不起作用。但由于这显然是 Ubuntu,所以sudo
通常是可用的。为了避免这种情况,您可能想尝试第二个选择:
`$easy_install 2>&1 | tail -n 1`
尝试放弃使用它tail -1
,它正在被标准形式取代tail -n 1
。我自己发现这很难,但我不喜欢弃用警告。 :)
警告: 如果$easy_install
存在并且您不会得到这种类型的输出,这些命令中的任何一个都是大量的安全风险。你最终可以执行任意的事情。你可以通过更加奢侈来保护自己:
`$easy_install 2>&1 >/dev/null | grep '^sudo apt-get install'`
这将丢弃stdout
,并且只会运行以 开头的任何内容sudo apt-get install
,这可以很好地限制事情,但比sudo apt-get install $package
自己输入要烦人得多。
答案2
错误输出通常进入标准错误,而不是标准输出;你可以通过添加来捕捉到这一点2>&1
。
$ easy_install 2>&1 | grep sudo
也就是说,他们使用 shell 函数来做到这一点,我怀疑对该函数的微小更改将允许它询问您,然后自行执行。