Questions tagged «pipe»

Unix管道连接两个进程的文件描述符。使用在<unistd.h>中声明的POSIX pipe()函数创建管道。外壳程序使用“ |”在进程之间提供管道创建。

4
如何理解管道
当我只是在bash中使用管道时,我对此并没有多加考虑。但是,当我使用系统调用pipe()和fork()一起阅读一些C代码示例时,我不知道如何理解管道,包括匿名管道和命名管道。 经常听到“ Linux / Unix中的所有内容都是文件”。我想知道管道实际上是否是文件,以便它连接的一部分写入管道文件,而另一部分从管道文件读取吗?如果是,在哪里创建匿名管道的管道文件?在/ tmp,/ dev或...? 但是,从命名管道的示例中,我还了解到,使用管道比显式使用临时文件具有空间和时间性能上的优势,这可能是因为管道的实现中没有涉及文件。同样,管道似乎不像文件那样存储数据。所以我怀疑管道实际上是一个文件。

2
超时,管道中断和wc
我有一个想法可以快速对一些减压程序进行基准测试。例如,对于gz,我将运行以下命令: timeout 10 zcat foo.gz | wc -c 这将测量解压缩器可以在10秒内提取的数据量。 唯一的问题是,它不起作用:因为zcat被杀死,wc也被杀死,所以我没有得到字节数,只是一条Terminated消息。 因此,问题是:有没有一种方法可以通过某种方式阻止信号来从wc获取计数,或者使用替代方法而不是wc来打印结果,即使它获得了术语信号也是如此。 当然,还有其他选择: 写入临时文件: timeout 10 zcat foo.gz &gt; /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x 问题是使用大量内存,并且可能会降低性能。 使用ulimit代替: ulimit -t 10; zcat foo.gz | wc -c 这也可以,但是仅测量cpu时间,因此不会测量由于I / O(例如,由于压缩效果更差,需要从磁盘读取更多字节)而导致的速度降低。 制作较小的测试文件: 嗯,这当然可以工作,并且可能是最好的解决方案。但是,这会创建很多临时文件。
20 pipe  timeout 

3
非阻塞缓冲命名管道?
我正在寻找我怀疑不存在的东西:一个非阻塞的缓冲命名管道(fifo),可从命令行使用。有这样的事吗? 这是用例:假设我有一个进程将在后台长时间运行,并向吐出大量输出stdout。我不是很在意输出,也不想存储它(也许我没有足够的空间),但是我想定期“插入”并跟踪其操作,然后再次退出并留给它做它的工作。因此,我想将其输出重定向到此理论上经过缓冲的,无阻塞的命名管道,然后定期使用它。 所以基本上我想这样开始(10M即缓冲区的大小): mkmagicfifo magicfifo 10M spewingprocess &gt; magicfifo &amp; ...并定期进去看看发生了什么... tail -f magicfifo ... 而不 magicfifo存储所有输出(因此,不是普通文件),也没有在输出被填满且未被点击时阻止喷出过程(因此,不是很普通的命名管道)。 我不认为涉及tail或prune将要解决的解决方案(好吧,我可以考虑解决一个涉及的问题tail),因为tail仍然需要将所有数据存储在某个地方(如果我想插手或放弃查看),并且prune必须重写文件,大概(我承认我没有尝试/证明过)破坏了生成所有输出的过程的重定向。 我希望我可以写一些实用程序来做到这一点,但是* nix有 在文件和管道方面很多很棒的方面,我只是忍不住认为它存在并且我只是不知道。 那么:有这样的事情吗?

3
如果通过cat管道传输,则grep直到EOF才输出
给出这个最小的例子 ( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) 它输出LINE 1,然后,在一秒钟后,输出LINE 2,如预期。 如果我们通过管道 grep LINE ( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE 行为与预期的情况相同。 如果,或者,我们将其通过管道传输到 cat ( echo "LINE 1" ; sleep 1 ; echo "LINE 2" …
19 bash  grep  pipe 

2
如何终止Linux tee命令而不杀死它从其接收的应用程序
我有一个bash脚本,只要Linux机器通电就可以运行。我按如下所示启动它: ( /mnt/apps/start.sh 2&gt;&amp;1 | tee /tmp/nginx/debug_log.log ) &amp; 启动后,我可以在ps输出中看到tee命令,如下所示: $ ps | grep tee 418 root 0:02 tee /tmp/nginx/debug_log.log 3557 root 0:00 grep tee 我有一个功能可以监视tee生成的日志的大小,并在日志达到一定大小时杀死tee命令: monitor_debug_log_size() { ## Monitor the file size of the debug log to make sure it does not get too big while true; do cecho …
19 linux  scripting  pipe  kill  tee 

4
如何在互连的命令之间实现循环数据流?
我知道两种类型的命令如何相互连接: 通过使用管道(将std-output放入下一个命令的std-input中)。 通过使用T恤(将输出拼接成许多输出)。 我不知道这是否可能,所以我画了一个假设的连接类型: 如何在命令之间实现循环数据流,例如在此伪代码中,我使用变量而不是命令。 pseudo-code: a = 1 # start condition repeat { b = tripple(a) c = sin(b) a = c + 1 }

3
readarray(或管道)问题
我坚持使用奇怪的readarray命令行为。 的man bash状态: readarray Read lines from the standard input into the indexed array variable array 但是这些脚本不起作用(数组为空): unset arr; (echo a; echo b; echo c) | readarray arr; echo ${#arr[@]} unset arr; cat /etc/passwd | readarray arr; echo ${#arr[@]} 这些工作: unset arr; readarray arr &lt; /etc/passwd ; echo ${#arr[@]} unset …
19 bash  pipe 

3
使用^作为外壳元字符
我今天写了一个小脚本,其中包含 grep -q ^local0 /etc/syslog.conf 在审查过程中,一位同事建议^local0引用该词,因为^在Bourne外壳中意为“烟斗”。对此声明感到惊讶,我试图查找提及此内容的任何参考。我在互联网上没有发现任何暗示这是问题的信息。 但是,事实证明,bsh在AIX 7上的实现(声称是Bourne shell)实际上具有以下行为: &gt; bsh $ ls ^ wc 23 23 183 $ ls | wc 23 23 183 我尝试过的其他“ Bourne shell”实现^都没有这种行为的方式(也就是说,根本不被认为是shell元字符)。我sh在CentOS(实际上是bash)和shFreeBSD(不是bash)上进行了尝试。我没有很多其他系统可以尝试。 这是预期的行为吗?哪些壳被认为^是管道元字符?

4
为什么有些命令不从标准输入中读取?
我想知道什么时候应该使用管道,什么时候不应该使用管道。 举例来说,要终止处理pdf文件的某些进程,使用管道将无法执行以下操作: ps aux | grep pdf | awk '{print $2}'|kill 相反,我们只能通过以下方式做到这一点: kill $(ps aux| grep pdf| awk '{print $2}') 要么 ps aux | grep pdf | awk '{print $2}'| xargs kill 根据man bash(版本4.1.2): The standard output of command is connected via a pipe to the standard input of command2. …
19 shell  pipe  arguments  stdin 

3
echo vs <<<,还是Bash Award中无用的echo?
到目前为止,cat奖的无用使用是众所周知的,并且还提到了无用的使用echo(与该问题无关)。我想知道是否应该有“无用的echoBash奖”:根据一些非常不科学的测量,管道似乎比heredocs和herestring慢得多: Heredocs: for reps in 1 2 3 do time for i in {1..1000} do cat &lt;&lt;'END' test string END done &gt; /dev/null done real 0m1.786s user 0m0.212s sys 0m0.332s real 0m1.817s user 0m0.232s sys 0m0.332s real 0m1.846s user 0m0.256s sys 0m0.320s 串 for reps in 1 2 3 do …

1
为什么直到磁盘装满后才将tar压缩到dd中?
我有一个磁盘映像的tar存档。该tar文件中的图片大小约为4GB。我将的输出传递tar xf到,dd以将磁盘映像写入SD卡。直到存储卡已满,磁盘转储才会停止。这是我的shell会话: $ ls -l disk.img.tgz -rw-r--r-- 1 confus confus 192M Okt 5 00:53 $ tar -tvf disk.img.tgz -rw-r--r-- root/root 4294968320 2018-10-05 00:52 disk.img $ lsblk -lb /dev/sdc NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdc 8:32 1 16022241280 0 disk $ tar zxf disk.img.tgz -O | sudo dd status=progress …
18 pipe  tar  dd  disk-image 


2
如何使用管道组成bash函数?
我用这种方式定义的功能很少: function f { read and process $1 ... echo $result } 我想将它们组合在一起,以便调用看起来像f | g | h。 我应该使用哪种惯用法将用于参数的函数转换为从stdin读取参数的函数?是否可以从流中读取成对的参数元组而无需将其转义(例如,空终止)?

3
如何下载RPM软件包并将其安装在一行中?
我想知道是否可以使用wget它下载RPM,然后通过管道将sudo rpm -i其安装到一行中?我意识到我可以跑步: wget -c &lt;URL&gt; sudo rpm -i &lt;PACKAGE-NAME&gt;.rpm 安装软件包,但我想知道是否有可能使用安静模式并写入wget的标准输出选项来在一行中完成此操作。我尝试使用: wget -cqO- &lt;URL&gt; | sudo rpm -i 但它返回: rpm: no packages given for install
18 pipe  rpm  wget 

4
输出到stdout并同时grep到文件中
我有一个将文本输出到的脚本stdout。我想在终端中看到所有这些输出,同时我想过滤一些行并将其保存在文件中。例: $ myscript Line A Line B Line C $ myscript | grep -P 'A|C' &gt; out.file $ cat out.file Line A Line C 我想在终端中查看第一个命令的输出,并将第二个命令的输出保存在文件中。同时。我尝试使用tee,但没有结果,或者更好,结果相反。
18 grep  pipe  stdout  tee 

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.