标签: pipe

关闭管道中的缓冲

我有一个调用两个命令的脚本:

long_running_command | print_progress
Run Code Online (Sandbox Code Playgroud)

long_running_command打印的进展,但我很不满意它。我正在使用print_progress使其更好(即,我在一行中打印进度)。

问题:将管道连接到标准输出也会激活一个 4K 缓冲区,所以漂亮的打印程序什么都没有……什么都没有……什么都没有……很多……:)

如何禁用4K缓冲区long_running_command(不,我没有源)?

shell pipe buffer

475
推荐指数
9
解决办法
26万
查看次数

获取通过管道传输到另一个进程的退出状态

我有两个进程foobar,用管道连接:

$ foo | bar
Run Code Online (Sandbox Code Playgroud)

bar总是退出 0;我对foo. 有什么办法可以得到吗?

shell pipe exit

392
推荐指数
11
解决办法
20万
查看次数

如何从某些输出的每一行中修剪前导和尾随空格?

我想从输出的每一行中删除所有前导和尾随空格和制表符。

有没有一个简单的工具,比如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)

pipe shell-script text-processing whitespace

265
推荐指数
10
解决办法
52万
查看次数

将上一个命令的输出作为参数传递给下一个

我有一个将数据输出到 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)

command-line pipe command-substitution output arguments

179
推荐指数
5
解决办法
47万
查看次数

管道缓冲区有多大?

作为评论,我很困惑为什么 makefile 中的“| true”与“|| true”用户cjm写道具有相同的效果

另一个要避免的原因| true是,如果命令产生足够的输出来填满管道缓冲区,它将阻塞等待 true 读取它。

我们是否有办法找出管道缓冲区的大小?

pipe buffer

162
推荐指数
5
解决办法
18万
查看次数

Bash: ">|" 有什么作用 做?

我刚刚看到这个写下来;

$ some-command >| /tmp/output.txt
Run Code Online (Sandbox Code Playgroud)

标准重定向中使用垂直管道将一个命令的输出“管道”到另一个命令>|,实际上完全没用,因为它与>在这种情况下相同?

bash pipe io-redirection

162
推荐指数
1
解决办法
2万
查看次数

临时数据的伪文件

我经常想将相对较短的字符串数据(虽然可能是几行)提供给命令行程序,这些程序只以重复的方式接受来自文件(例如 wdiff)的输入。当然我可以创建一个或多个临时文件,将字符串保存在那里,然后以文件名作为参数运行命令。但在我看来,如果数据实际写入磁盘,则此过程的效率会非常低,而且如果我多次重复此过程(例如,如果我想提供单行长文本),它可能会对磁盘造成不必要的伤害文件到 wdiff。有没有推荐的方法来规避这种情况,比如通过使用诸如管道之类的伪文件来临时存储数据而不实际将其写入磁盘(或仅在超过临界长度时才将其写入)。请注意, wdiff 有两个参数,并且,wdiff <"text".

bash pipe files

123
推荐指数
3
解决办法
7万
查看次数

如何将文件列表传递给 grep

我正在使用find并获取我想要grep通过的文件列表。我如何通过管道将该列表传递给grep

grep pipe find

121
推荐指数
2
解决办法
14万
查看次数

如何使用带有管道命令/程序链的 watch 命令

我通常使用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)

bash pipe watch

113
推荐指数
3
解决办法
5万
查看次数

管道命令以什么顺序运行?

我从来没有真正考虑过 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 ps

109
推荐指数
3
解决办法
3万
查看次数