回答
$ while read line
> do
> tr 3 4
> done<<EOF
> 1
> 2
> 3
> 4
> EOF
2
4
4
这里会发生什么是read line
获取具有1 第一行输入的其余部分传递给tr
,其与4代替3,所以2 3 4变为2 4 4
1进入一个变量行。示例
$ while read foo; do echo "This is $foo"; done <<EOF
> madness
> SPARTAAAAAAAAAAAA
> EOF
This is madness
This is SPARTAAAAAAAAAAAA
您看到的奇怪行为是因为read是内建的,并且有点特别。例如,当您执行管道配置时,例如,假设您编写了
echo "foo bar" | read i
您会希望在$ i中找到某些东西,对不对?尝试一下,它将是空的。为什么? 当您执行管道时,管道的每个命令都在子shell中运行。这对所有事情都是如此,并始终如此。
读是有点奇怪,因为它不是一个命令,它是一个内置的shell,它必须导出一个变量,以便您可以看到它。如果你使用管道,就像上面的例子一样,它会在子进程(subshell)中导出i
,你永远不会看到它,因为你正在使用的shell环境是父进程,并且子shell不能设置环境其父母。
在你的情况下,会发生什么read
和while
作为内建函数在您的shell中执行。 read
尽职尽责地将stdin的第一件事情设置为同一个shell的变量。这将从stdin中移除1,因为这是内置读取的内容。 stdin现在剩下的东西被传递给tr,因为在此期间,stdin被第一个命令拦截。试试这个
$ while true; do rev; echo "x"; done <<EOF
> hello
> EOF
olleh
你会一直停留在一堆x。 rev已经完成(在第一行中检查它的输出),stdin被关闭(你用EOF做过)。 while循环会一直持续下去(你会得到一个x的级联),但是你不能再提供任何对rev的东西,因为你不再为stdin打字。
Stefano的回答非常好。 也许你想这样做?
tr 3 4 <<EOF
1
2
3
4
EOF
这是Stephano答案的后续行动 - 所有功劳都应归功于他。这里是你如何能理解这一点:
首先你问sh'读'一行,所以它。然后你问它做'tr 3 4'。现在,'read'只读取一行,但'tr'将读取所有的输入,直到完成,所以当你回到'读'时,没有什么更多的标准输入和程序完成。因为你从来没有告诉sh来echo $ line,所以你不会在输出中得到1。
以下应该打印1 2 4 4
while read line
do
echo $line | tr 3 4
done
- 1. Sh脚本是什么`$?`?
- 2. 为什么sh脚本不能工作
- 3. 为什么下面的程序不会生成任何可见的输出?
- 4. 为什么下面的两个代码会生成不同的输出?
- 5. 为什么下面的代码不会产生任何输出?
- 6. 什么是sh脚本中的$ {Tmp0}?
- 7. 强制下载脚本和readfile:为什么readfile输出我的html页面?
- 8. 为什么这个脚本只能输出一半的输出?
- 9. 为什么在shell脚本输出文件被写成单行?
- 10. Python CGI - 脚本输出生成页面的源代码
- 11. 在wxpython文本控件中输出由logging.info生成的输出
- 12. 为什么找不到脚本输出到标准输出?
- 13. 为什么我应该版本控制由Xtext/Xtend生成的所有文件?
- 14. 什么是=〜在下面的脚本
- 15. 为什么`((0))`在.sh脚本中返回值为1?
- 16. 我的sh脚本有问题不知道为什么?
- 17. 为什么Sh和Bash之间的命令输出不同?
- 18. 为什么下面的代码的输出为零?
- 19. 为什么下面的程序给出了输出:A
- 20. 如何使用child_process.spawn生成从ruby脚本输出流输出
- 21. Schematron sh脚本不行为
- 22. 下面的代码会输出什么,为什么?谁能解释一下?
- 23. 为什么下面的程序将-80作为输出?
- 24. 为什么printf在我的简单脚本中产生奇怪的输出?
- 25. perf脚本输出是什么意思?
- 26. 由PowerDesigner生成的sql server脚本
- 27. 为什么我的随机生成的数组只输出零?
- 28. 为什么生成的输出文件的行数不同
- 29. 为什么MSXML中的createProcessingInstruction生成不完整的输出?
- 30. 生成脚本时出错
这是在过去的考试对象,我跃跃欲试,而我无法理解的输出。我不明白为什么它会跳过1. – LDK 2009-08-10 19:07:02
我也不明白,为什么'read line'会得到第一行,只有其余部分才会被tr? '1'去哪里? – 2009-08-10 19:22:39
它进入一个变量$行 – 2009-08-10 19:32:13