【问题标题】:Shell script can not pass file data to shell inputShell 脚本无法将文件数据传递给 shell 输入
【发布时间】:2012-04-05 13:42:10
【问题描述】:
cal April 2012 | cat > t | cat < t | more

为什么什么都不显示?为什么不显示

     April 2012       
Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30  

【问题讨论】:

  • | 将第一个进程的 stdout (1) 与第二个进程的 stdin (0) 连接起来。将输出重定向到文件后,没有任何标准输出,因此没有任何东西可以通过管道传输。此外,cat | cat &lt; file 并没有什么意义,它有两个输入到标准输入
  • @knittl 那么你的意思是cat &lt; t 根本没有被执行?
  • 那么,有没有其他方法可以做到这一点?
  • @PavanManjunath 键入 cat (仅)完美显示日历
  • @knittl 同意;为了概念清晰,我牺牲了技术精度。 :) 我想用 fd0 来描述它会有助于理解冲突 STDIN 的为什么。这实际上是一个有趣的问题:如果您使用 strace cal April 2012 | cat &gt; t | strace cat &lt; t 运行第二个 cat,您会看到它实际上从 fd0 读取 cal 文本,并将 cal 文本写入 fd1。 Bash 一定是在洗牌。

标签: linux shell cat piping


【解决方案1】:

|(匿名管道)将第一个进程的标准输出 (1) 与第二个进程的标准输入 (0) 连接起来。将输出重定向到文件后,没有任何标准输出,因此没有任何东西可以通过管道传输。另外,cat | cat &lt; file 并没有什么意义,它有两个输入连接到标准输入(至少在 bash 中,重定向稍后出现,“wins”:echo uiae | cat &lt;somefile 将输出某个文件的内容)

如果要显示命令的输出,同时将其写入文件,请使用tee 二进制文件。它写入文件,但仍写入标准输出

cal April 2012 | tee t | more
cat t # content of the above `cal` command

【讨论】:

  • 你能说出一个从文件中读取并给出标准输出的命令吗? (如 tee 写入文件和标准输出)
【解决方案2】:

因为第一个cat &gt; t 将其所有输出发送到一个名为t文件,不再为管道留下任何内容。

如果您的意图是将其发送到文件并通过more 发送到终端,只需使用:

cal April 2012 | tee t | more

这个| cat &lt; t 结构非常奇怪,我什至不确定它是否会起作用。它试图将两个完全不同的东西连接到cat 的标准输入,当然这是不必要的。

【讨论】:

    【解决方案3】:

    如果当前目录中没有名为 t 的现有文件,这对我有用。我在 Ubuntu Oneiric 上使用 bash。

    $ cal April 2012 | cat > t | cat < t | more
     April 2012       
     Su Mo Tu We Th Fr Sa  
     1  2  3  4  5  6  7  
     8  9 10 11 12 13 14  
     15 16 17 18 19 20 21  
     22 23 24 25 26 27 28  
     29 30
    $ cal April 2012 | cat > t | cat < t | more
    $ rm t
    $ cal April 2012 | cat > t | cat < t | more
     April 2012       
     Su Mo Tu We Th Fr Sa  
     1  2  3  4  5  6  7  
     8  9 10 11 12 13 14  
     15 16 17 18 19 20 21  
     22 23 24 25 26 27 28  
     29 30
    

    【讨论】:

    • 不应该工作(在这里也不能工作——debian 挤压。我可以稍后在 ubuntu 中测试)
    • 如果这个技巧对你有用,你能解释一下为什么会这样吗?
    • 嗯。如果我一遍又一遍地运行cal April 2012 | cat &gt; t | cat &lt; t | more,有时我会得到输出,有时我不会。 GNU bash,版本 4.2.10(1)-release (i686-pc-linux-gnu)
    • @orzechowskid 我遇到了同样的问题。它有时对我有用,有时对我有用!太奇怪了!
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多