小编Joh*_*n B的帖子

管道和进程替换之间的性能差异

我倾向于在我的bash脚本在进程替换在大多数情况下使用的管道,尤其是在使用多组的命令,因为它似乎更具可读性做的情况下,... | ... | ...过度... < <(... < <(...))

我想知道为什么在某些情况下使用进程替换比使用管道要快得多。

为了测试这一点,我time使用10000相同附加命令的迭代编写了两个脚本,一个使用管道,另一个使用进程替换。

脚本:

pipeline.bash

for i in {1..10000}; do
    echo foo bar |
    while read; do
        echo $REPLY >/dev/null
    done
done
Run Code Online (Sandbox Code Playgroud)

proc-sub.bash

for i in {1..10000}; do
    while read; do
        echo $REPLY >/dev/null
    done < <(echo foo bar)
done
Run Code Online (Sandbox Code Playgroud)

结果:

~$ time ./pipeline.bash

real    0m17.678s
user    0m14.666s
sys     0m14.807s

~$ time ./proc-sub.bash

real    0m8.479s
user    0m4.649s
sys     0m6.358s
Run Code Online (Sandbox Code Playgroud)

我知道管道创建了一个子进程,而进程替换创建了一个命名管道或一些文件/dev/fd,但不清楚这些差异如何影响性能。

performance shell bash pipe process-substitution

8
推荐指数
1
解决办法
2979
查看次数

在 shell 脚本变量定义中执行浮点运算

我理解bash和其他一些解释器只对整数执行算术运算。在下面的for循环中,我怎样才能做到这一点?我读过bc可以使用,但不确定如何bc在这种情况下使用。

total=0
for number in `cat /path/to/file`; do
        total=$(($total+$number))
done
average=$(($total/10))
echo Average is $average
Run Code Online (Sandbox Code Playgroud)

文件:

1.143362
1.193994
1.210489
1.210540
1.227611
1.243496
1.260872
1.276752
1.294121
1.427371
Run Code Online (Sandbox Code Playgroud)

bash shell-script bc

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

等待后台进程以反向匹配进程 ID 完成

我希望在循环中运行多个后台进程,但只想等待所有这些进程完成,仍然允许另一个后台进程继续。

在做了一些研究之后,我只看到需要我列出我想要的每个进程 IDwait而不是将它们与单个进程 ID 反向匹配的解决方案。似乎像这样的东西wait != $pid会非常有用。

示例脚本:

#!/bin/bash

command1 &
pid=$!
for i in ${array[@]}; do
    for n in $(seq 3); do
        if [ $n -eq 1 ];
            command2 > file &
        else
            command2 >> file &
        fi
    done
done
Run Code Online (Sandbox Code Playgroud)

在此示例中,我希望等待每个进程完成,除非$pid不必使用wait命令将它们全部列出。这可能吗?

bash process

4
推荐指数
1
解决办法
4618
查看次数

在 Shell 脚本中隐藏命令消息

bash脚本中,我正在使用conntrack和 之类的工具tcpdump将结果输出到文件,但希望在执行命令/脚本后隐藏命令行的第一个输出行上显示的标准消息。

信息:

conntrack v1.0.0 (conntrack-tools): 6 flow entries have been shown.

阅读bash手册页后,我尝试了以下操作:

conntrack -L|grep "dport=6439" &> /tmp/file
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么重定向选项,conntrack说明流条目数的消息总是显示在我执行脚本的 shell 中。同样的问题也发生在tcpdump那里列出了捕获装置和捕获的数据包的数量,等等。

当然,我可以clearconntrackortcpdump命令之后添加以快速隐藏输出,但该解决方案很难看。

如何隐藏这些类型的消息?

shell bash

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