Questions tagged «pipe»

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

3
如何下载存档并解压缩而不将存档保存到磁盘?
我想下载并解压缩指定目录下的档案。到目前为止,这是我一直在做的事情: wget http://downloads.mysql.com/source/dbt2-0.37.50.3.tar.gz tar zxf dbt2-0.37.50.3.tar.gz mv dbt2-0.37.50.3 dbt2 我想即时下载并解压缩存档,而无需将其tar.gz写入磁盘。我认为可以通过将的输出wget传递给tar,并给出tar一个目标来实现,但实际上我不知道如何将各个部分放在一起。
62 shell  pipe  tar  wget 

4
与未命名管道相比,使用命名管道有什么优势?
我正在审查一组由UNIX管理员提出的面试问题。我找到了一个名为“命名管道”的主题。 我搜索了这个话题;在某种程度上,我已经能够理解它:- 命名管道|| 先进先出 但是我仍然感到我缺乏何时使用这种特殊类型管道的知识。是否有未命名管道无法正常工作的特殊情况?
51 pipe 

5
mknod命令的作用是什么?
我刚开始使用Ubuntu作为主要操作系统,我想学习一些我不应该做的事情,并了解人们过去做过的坏事。我收到了这些电子邮件,这些邮件讲述了UNIX和Linux sys管理员在新系统上在自己的系统上所做的恐怖故事。他们中的许多人都使用了mknod命令来发现和解决问题。我以前从未听说过此命令,而Ubuntu中的手册页不是很有帮助。所以我的问题是,该命令用于什么用途?在日常使用中有哪些有用的示例?

4
我应该照顾不必要的猫吗?
许多命令行实用程序可以从管道或文件名参数中获取输入。对于长Shell脚本,我发现以a开头的链cat使其更具可读性,尤其是在第一个命令需要多行参数的情况下。 相比 sed s/bla/blaha/ data \ | grep blah \ | grep -n babla 和 cat data \ | sed s/bla/blaha/ \ | grep blah \ | grep -n babla 后一种方法效率较低吗?如果是这样,差异是否足以关心脚本是否运行(例如每秒运行一次)?可读性差异不大。

3
如何在管道命令/程序链中使用监视命令
我通常使用watchlinux实用程序每n秒重复观察一次命令的输出,例如watch df -h /some_volume/ 但是我似乎无法使用watch一系列管道命令: $ watch ls -ltr|tail -n 1 如果我这样做的话,watch实际上ls -ltr是在监视并且输出正在传递给tail -n 1它,什么也不会输出。 如果我尝试这样做: $ watch (ls -ltr|tail -n 1) 我懂了 $ watch: syntax error near unexpected token `ls' 并且以下任何一项由于某种原因而失败: $ watch &lt;(ls -ltr|tail -n 1) $ watch &lt; &lt;(ls -ltr|tail -n 1) $ watch $(ls -ltr|tail -n …
50 linux  bash  pipe  watch 

2
Bash:如何从命令输出一次读取一行?
我正在尝试使用读取bash中命令的输出while loop。 while read -r line do echo "$line" done &lt;&lt;&lt; $(find . -type f) 我得到的输出 ranveer@ranveer:~/tmp$ bash test.sh ./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello ranveer@ranveer:~/tmp$ 在这之后我尝试了 $(find . -type f) | while read -r line do echo "$line" done 但是它产生了一个错误test.sh: line 5: ./test.py: Permission denied。 因此,我如何逐行阅读它,因为我认为当前它一次吞噬了整行。 要求的输出: ./test.py …
49 bash  shell  find  pipe 

10
如何检查管道是否为空,如果不是,则对数据运行命令?
我已经在bash脚本中通过管道传递了一条线,并希望在将其提供给程序之前检查管道是否具有数据。 我发现有关搜索,test -t 0但在这里不起作用。始终返回false。那么如何确保管道中有数据呢? 例: echo "string" | [ -t 0 ] &amp;&amp; echo "empty" || echo "fill" 输出: fill echo "string" | tail -n+2 | [ -t 0 ] &amp;&amp; echo "empty" || echo "fill" 输出: fill 有别于标准/规范方式来测试上述管道是否产生了输出?输入需要保留,以将其传递给程序。这概括了如何将输出从一个进程传递到另一个进程,但仅在第一个进程具有输出时才执行?重点是发送电子邮件。
42 bash  shell  pipe 

2
为什么进程替换会导致一个名为/ dev / fd / 63的文件,这是一个管道?
我试图在此特定示例的上下文中了解命名管道。 我输入&lt;(ls -l)我的终端,并输出为bash: /dev/fd/63: Permission denied。 如果输入cat &lt;(ls -l),我可以看到目录内容。如果我更换cat用echo,我觉得我得到的终端名称(或者是什么呢?)。 echo &lt;(ls -l)将输出给出为/dev/fd/63。 另外,这个示例输出对我来说还不清楚。 ls -l &lt;(echo "Whatever") lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -&gt; pipe:[48078752] 但是,如果我给出,ls -l &lt;()它将列出目录内容。 如果命名管道发生了什么情况?

7
条件管道
说我有以下管道: cmd1 &lt; input.txt |\ cmd2 |\ cmd4 |\ cmd5 |\ cmd6 |\ (...) |\ cmdN &gt; result.txt 在某些情况下,我想cmd3在cmd2和之间添加一个cmd4。有没有一种方法可以创建一种有条件的管道,而无需将cmd2的结果保存到临时文件中?我会想到类似: cmd1 &lt; input.txt |\ cmd2 |\ (${DEFINED}? cmd3 : cat ) |\ cmd4 |\ cmd5 |\ cmd6 |\ (...) |\ cmdN &gt; result.txt
39 pipe 

3
管道式xargs后的管道命令
HP-UX ***** B.11.23 U ia64 ****无限用户许可证 find . -type d -name *log* | xargs ls -la 给我目录名称(目录名称中包含log的目录名称),后跟该目录中的所有文件。 该目录 /var/opt/SID/application_a/log/, /var/opt/SID/application_b/log/, /var/opt/SID/application_c/log/等包含日志文件。 我只希望该ls命令列出两个最新的日志文件,通常可以使用来找到ls -latr | tail -2。 输出必须是这样的。 /var/opt/SID/application_a/log/ -rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1 -rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2 /var/opt/SID/application_b/log/ -rw-rw-rw- 1 user1 …
38 shell  find  pipe  xargs 

6
如何诱使命令认为其输出将发送到终端
给定一条命令,该命令在其输出将输出到终端时会更改其行为(例如,产生彩色输出),如何在保留更改的行为的同时在管道中重定向该输出?必须有一个我不知道的实用程序。 某些命令(如grep --color=always)具有选项标志来强制执行该行为,但问题是如何解决仅依赖于测试其输出文件描述符的程序。 如果有关系的话,我的外壳bash在Linux上。
38 shell  pipe  utilities  stdout  pty 

3
管道如何限制内存使用量?
Brian Kernighan在此视频中解释了贝尔实验室基于内存限制而对小语言/程序的早期吸引力 一台大机器将是64 k字节,即K,而不是M或G,这意味着任何单个程序都不会太大,因此自然会倾向于编写小程序,然后编写管道机制,基本上是输入输出重定向,因此可以将一个程序链接到另一个程序。 但是考虑到数据必须存储在RAM中才能在程序之间传输,因此我不理解这如何限制内存使用。 来自维基百科: 在大多数类似Unix的系统中,管道的所有进程都是同时启动的[强调我的],并适当地连接它们的流,并由调度程序以及计算机上运行的所有其他进程进行管理。其中一个重要方面是将Unix管道与其他管道实现区分开来,它是缓冲的概念:例如,发送程序每秒可以产生5000个字节,而接收程序每秒只能接受100个字节,但没有。数据丢失。而是将发送程序的输出保存在缓冲区中。当接收程序准备读取数据时,管道中的下一个程序将从缓冲区读取数据。在Linux中,缓冲区的大小为65536字节(64KB)。如果需要,可以使用称为bfr的开源第三方过滤器来提供更大的缓冲区。 这使我更加困惑,因为这完全破坏了小程序的目的(尽管它们会在一定程度上模块化)。 作为第一个问题(内存限制取决于大小数据的问题),我唯一能想到的解决方案是,那时根本就不会计算大型数据集,而真正的问题管道本应解决的是程序本身所需的内存量。但是考虑到Wikipedia引号中的粗体字,即使这样也使我感到困惑:因为一次不会执行一个程序。 如果使用了临时文件,那么所有这些都将非常有意义,但是据我了解,管道不会写入磁盘(除非使用交换)。 例: sed 'simplesubstitution' file | sort | uniq &gt; file2 对我来说sed很明显,正在读取文件并逐行吐出。但是sort,正如BK在链接的视频中指出的那样,它是一个句号,因此必须将所有数据读入内存(或对吗?),然后将其传递给uniq,(我认为)这将是一个一次在线程序。但是在第一个和第二个管道之间,所有数据都必须存储在内存中,不是吗?
36 pipe  history 

4
为什么“ tail -f…| 尾巴”无法产生任何输出?
为什么以下命令不产生任何输出? $ tail -f /etc/passwd | tail 阅读有关缓冲的内容后,我尝试了以下操作,但无济于事: $ tail -f /etc/passwd | stdbuf -oL tail 请注意,以下内容确实会产生输出: $ tail /etc/passwd | tail 这样: $ tail -f /etc/passwd | head 我使用的是尾部版本8.21(GNU coreutils)。
36 pipe  tail 


2
/ proc / PID / fd / X链接号
在Linux中,在中/proc/PID/fd/X,管道或套接字的文件描述符的链接具有数字,例如: l-wx------ 1 user user 64 Mar 24 00:05 1 -&gt; pipe:[6839] l-wx------ 1 user user 64 Mar 24 00:05 2 -&gt; pipe:[6839] lrwx------ 1 user user 64 Mar 24 00:05 3 -&gt; socket:[3142925] lrwx------ 1 user user 64 Mar 24 00:05 4 -&gt; socket:[3142926] lr-x------ 1 user user 64 …

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.