我有一个调用两个命令的脚本:
long_running_command | print_progress
Run Code Online (Sandbox Code Playgroud)
在long_running_command打印的进展,但我很不满意它。我正在使用print_progress使其更好(即,我在一行中打印进度)。
问题:将管道连接到标准输出也会激活一个 4K 缓冲区,所以漂亮的打印程序什么都没有……什么都没有……什么都没有……很多……:)
如何禁用4K缓冲区long_running_command(不,我没有源)?
我有两个进程foo和bar,用管道连接:
$ foo | bar
Run Code Online (Sandbox Code Playgroud)
bar总是退出 0;我对foo. 有什么办法可以得到吗?
我想从输出的每一行中删除所有前导和尾随空格和制表符。
有没有一个简单的工具,比如trim我可以将我的输出输入到其中?
示例文件:
test space at back 
 test space at front
TAB at end  
    TAB at front
sequence of some    space in the middle
some empty lines with differing TABS and spaces:
 test space at both ends 
Run Code Online (Sandbox Code Playgroud) 我有一个将数据输出到 stdout ( command1 -p=aaa -v=bbb -i=4)的命令。输出行可以具有以下值:
rate (10%) - name: value - 10Kbps
Run Code Online (Sandbox Code Playgroud)
我想 grep 该输出以存储该“速率”(我想管道在这里会很有用)。最后,我希望该速率是第二个命令的参数值(假设command2 -t=${rate})
我这边看起来很棘手;我想更好地了解如何使用管道、grep、sed 等。
我已经尝试了很多这样的组合,但我对这些感到困惑:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Run Code Online (Sandbox Code Playgroud) 作为评论,我很困惑为什么 makefile 中的“| true”与“|| true”用户cjm写道具有相同的效果:
另一个要避免的原因
| true是,如果命令产生足够的输出来填满管道缓冲区,它将阻塞等待 true 读取它。
我们是否有办法找出管道缓冲区的大小?
我刚刚看到这个写下来;
$ some-command >| /tmp/output.txt
Run Code Online (Sandbox Code Playgroud)
标准重定向中使用垂直管道将一个命令的输出“管道”到另一个命令>|,实际上完全没用,因为它与>在这种情况下相同?
我经常想将相对较短的字符串数据(虽然可能是几行)提供给命令行程序,这些程序只以重复的方式接受来自文件(例如 wdiff)的输入。当然我可以创建一个或多个临时文件,将字符串保存在那里,然后以文件名作为参数运行命令。但在我看来,如果数据实际写入磁盘,则此过程的效率会非常低,而且如果我多次重复此过程(例如,如果我想提供单行长文本),它可能会对磁盘造成不必要的伤害文件到 wdiff。有没有推荐的方法来规避这种情况,比如通过使用诸如管道之类的伪文件来临时存储数据而不实际将其写入磁盘(或仅在超过临界长度时才将其写入)。请注意, wdiff 有两个参数,并且,wdiff <"text".
我通常使用watchLinux 实用程序每隔n几秒重复观察一个命令的输出,例如在watch df -h /some_volume/.
但是我似乎无法使用watch管道命令系列,例如:
$ watch ls -ltr|tail -n 1
Run Code Online (Sandbox Code Playgroud)
如果我这样做,watch真的ls -ltr是在观察并且输出被传递给tail -n 1不输出任何东西。
如果我试试这个:
$ watch (ls -ltr|tail -n 1)
Run Code Online (Sandbox Code Playgroud)
我得到
$ watch: syntax error near unexpected token `ls'
Run Code Online (Sandbox Code Playgroud)
并且以下任何一种原因都失败了:
$ watch <(ls -ltr|tail -n 1)
$ watch < <(ls -ltr|tail -n 1)
$ watch $(ls -ltr|tail -n 1)
$ watch `ls -ltr|tail -n 1)`
Run Code Online (Sandbox Code Playgroud)
最后,如果这样做:
$ watch echo $(ls -ltr|tail -n 1) …Run Code Online (Sandbox Code Playgroud) 我从来没有真正考虑过 shell 是如何实际执行管道命令的。我一直被告知“一个程序的标准输出通过管道传输到另一个程序的标准输入中”,这是对管道的一种思考方式。所以很自然地,我认为在 say 的情况下,A | B,A将首先运行,然后B获取 的标准输出A,并使用标准输出A作为其输入。  
但我注意到,当人们搜索特定的工艺ps,他们会包括grep -v "grep"在命令的末尾,以确保grep不会出现在最终的输出。
这意味着在命令ps aux | grep "bash" | grep -v "grep"中暗示ps知道grep正在运行,因此在ps. 但是如果ps在它的输出通过管道传输到 之前完成运行,它grep怎么知道它grep正在运行?
flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY          TIME CMD
3773 pts/0    00:00:00 bash
3784 pts/0    00:00:00 ps
3785 pts/0    00:00:00 grep
Run Code Online (Sandbox Code Playgroud) pipe ×10
bash ×3
buffer ×2
shell ×2
arguments ×1
command-line ×1
exit ×1
files ×1
find ×1
grep ×1
output ×1
ps ×1
shell-script ×1
watch ×1
whitespace ×1