如何对失败命令的输出采取行动

如何对失败命令的输出采取行动

可能的重复:
在命令行中从 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 函数来做到这一点,我怀疑对该函数的微小更改将允许它询问您,然后自行执行。

相关内容