Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?_Bash_Asynchronous_Parallel Processing_Pipe_Buffer - Fatal编程技术网

在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?

在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?,bash,asynchronous,parallel-processing,pipe,buffer,Bash,Asynchronous,Parallel Processing,Pipe,Buffer,考虑以下Bash代码: (cmd1 & cmd2) | consumer 消费者在其标准输入上可能会看到什么 从cmd1输出,然后从cmd2输出 来自cmd1的行与来自cmd2的行任意穿插在一起 来自cmd1的字节与来自cmd2的字节任意分布 还有别的吗 您可以期望看到随机交错的数据,尽管如果行较短,很可能在大多数情况下会看到整行交错 由于进程将其stdout重定向到非交互式设备的管道,因此输出很可能会被完全缓冲。由于缓冲区已满时将被写入,很可能与行尾不对应,因此您可能会看到交错的缓冲

考虑以下Bash代码:

(cmd1 & cmd2) | consumer
消费者在其标准输入上可能会看到什么

  • cmd1
    输出,然后从
    cmd2
    输出
  • 来自
    cmd1
    的行与来自
    cmd2
    的行任意穿插在一起
  • 来自
    cmd1
    的字节与来自
    cmd2
    的字节任意分布
  • 还有别的吗

  • 您可以期望看到随机交错的数据,尽管如果行较短,很可能在大多数情况下会看到整行交错

    由于进程将其
    stdout
    重定向到非交互式设备的管道,因此输出很可能会被完全缓冲。由于缓冲区已满时将被写入,很可能与行尾不对应,因此您可能会看到交错的缓冲区,每个缓冲区的末尾都有交错的行

    :

    打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互设备时,标准输入和标准输出流被完全缓冲

    但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效果

    下面是一个快速测试:

    $ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
    117
    
    awk
    程序打印组合输出中未出现两次的任何行,包括所有混合行。所以在这种情况下,大约千分之一的线是混合的


    顺便说一下,在
    (cmd1和cmd2)
    中,只有
    cmd1
    在后台运行。但是,它们之间仍然是异步的。

    您可以看到随机交错的数据,尽管如果行较短,很可能在大多数情况下会看到整行交错

    由于进程将其
    stdout
    重定向到非交互式设备的管道,因此输出很可能会被完全缓冲。由于缓冲区已满时将被写入,很可能与行尾不对应,因此您可能会看到交错的缓冲区,每个缓冲区的末尾都有交错的行

    :

    打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互设备时,标准输入和标准输出流被完全缓冲

    但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效果

    下面是一个快速测试:

    $ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
    117
    
    awk
    程序打印组合输出中未出现两次的任何行,包括所有混合行。所以在这种情况下,大约千分之一的线是混合的


    顺便说一下,在
    (cmd1和cmd2)
    中,只有
    cmd1
    在后台运行。不过,它们彼此之间仍然是异步的。

    {{sleep 1;echo 1;sleep 2;echo 2;}&{sleep 1;echo 3;sleep 2;echo 4;};}cat作为一个快速测试。运行几次,您应该会看到两行交替。这里有一个更有趣的测试:
    ((while true;do echo line1;done)和(python-uc'while true:print(“line2”))| less
    ——在我的系统上,您有时会看到“line2line1”都在一行
    {sleep 1;echo one;sleep 2;echo two;}&{sleep 1;echo three;sleep 2;echo three;};}cat
    作为一个快速测试。运行几次,您应该会看到两行交替出现。下面是一个更有趣的测试:
    ((while true;do echo line1;done)&(python-uc'while true:print(“line2”))\less
    ——在我的系统上,您有时会看到“line2line1”都在一行上