2015-01-05 83 views
0

问题In a shell script: echo shell commands as they are executed之后,我想知道如何将执行/回显的命令重定向到文件(或变量)?如何在执行回显shell命令时执行

我试图通常标准输出重定向,像ls $HOME > foo.txt,设置在bash详细模式,set -v后,但只有LS输出被重定向。我想要的是将一个函数(称为“save_succ_cmdline()”)放在一个(复杂的)命令行前面(例如,save_succ_cmdlinegrep -m1 "model name" /proc/cpuinfo | sed 's/.*://' | cut -d" " -f -3),这样该函数将会保存如果成功,则给定命令行。

请注意,上面的grep -m1 "model name" ...示例只是给出一个带有特殊字符(|,',“)的命令行示例,我对这样的函数”save_succ_cmdline()“的期望是实际命令在功能名称grep -m1 "model name"...之后执行,函数验证退出代码([$? == 0])决定命令行是否可以保存,如果实际命令成功,函数(“save_succ_cmdline”)可以保存命令-line expression(with the pipe and everything)。

我会使用bash -o verbose功能让(暂时)保存命令行,但我无法做到这一点

在此先感谢。

+0

目前还不清楚“grep -m1”型号名称“/ proc/cpuinfo | sed's /.*://'| cut -d“”-f -3“正在使用'save_succ_cmdline'功能。你能澄清吗? – anubhava

+0

没错。我编辑了这个问题,希望它更清楚。 – Brandt

+0

'grep -m1“型号名称''会针对命令本身运行而不是输入的命令? – anubhava

回答

0

您的save_succ_cmdline函数只会看到命令行的grep -m1 "model name" /proc/cpuinfo部分,因为shell将会看到管道本身。

这就是说,如果你只是想grep部分,那么这将做你想做的。

save_succ_cmdline() { 
    "[email protected]" && cmd="[email protected]" 
} 

如果你想整个管道,那么你就需要整个参数报价以save_succ_cmdline"[email protected]"(或类似)使用eval,我不知道你能有这样的工作对于任意引用。

+0

是的。这才是重点。我需要处理特殊的字符。如果我标记详细模式('set -v'),我可以使用所有管道,引号等来回显给定的cmd行。 – Brandt

+0

verbose输出显示为shell的'stderr'(相同的地方提示去),所以你可能无法做到这一点。 –