Bash:如何将每个命令的输出重定向到文件?


5

我经常在这样的源代码仓库上运行搜索:

ack -l "foo bar" .

搜索可能需要10到60秒,并产生如下输出:

path/to/file1       
path/to/file2
path/to/file3

我经常使用这个别名来打开在vim中找到的所有文件:

alias go='gvim `fc -s` -p'

这样可以正常fc -s运行,但是会重新运行上一个命令,这可能需要几秒钟或几分钟。


将这样的内容附加到我以交互方式运行的每个命令中将非常有用:

| tee /tmp/lastCommand to all commands.  

这样,如果输出显示自己有用,那么我可以对它做其他事情。

用法示例:

类型:

find . -type f 

执行以下命令:

find . -type f | tee $lastOutLocation # Where lastOutputLocation=/tmp/lastOutput

然后,您可以使用类似以下内容的方法来过滤前面的命令:

lastOut | grep "SomeString" # Where lastOut is an alias to cat $lastOutputLocation

有什么机制可以用来做这样的事情吗? 我不认为别名会暴露这种行为。

潜在伤害:

  • 获得适用于复合命令的内容: echo 'baz' ; echo 'bar'
  • 在运行之前弄清楚如何修改用户键入的命令
  • 忽略诸如交互式输入之类的东西。不想捕获密码提示

可能的解决方案,我目前正在探索:


最简单的解决方案是将其包装在shell脚本(如run)中,该脚本将调用您要运行的带引号的命令。然后,您run 'find . -type f'将执行脚本find . -type f | tee $lastOutLocation。请注意,如上所述,我使用引号允许多个命令。
Julie Pelletier

2
考虑打字稿(script)命令
杰夫·谢

最大的障碍是希望访问终端而不仅仅是写入stdout的程序。管道连接到tee(或其他任何方式)与此不兼容。
吉尔斯

Answers:


1

将这样的内容附加到我以交互方式运行的每个命令中将非常有用:

| tee /tmp/lastCommand to all commands.  

一个可能的开始可能是使用~/.inputrc绑定密钥。(这对GNU readline库的配置文件。)例如,使用字母,O,作为一个记忆Ø本安输出...

Control-o: " | tee /tmp/lastCommand"

一个可以绑定到Return/ Enter键,但是该操作会产生意想不到的效果。


-1

如果我了解您要将命令的输出重定向到文件,可以通过以下方法完成:

#command > output_file
Or also #command | output_file

第一个更改输出通道,以便将其写入终端的所有内容写入到output_file,第二个更改两个程序的管道...


command | foofoo在可以执行的情况下起作用,并且不会写入foo
dhag
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.