破折号从stdin重定向到stdout

时间:2013-01-07 15:44:04

标签: linux bash shell

此问题的关键值与使用dash-symbol“ - ”重定向stdin流有关。

我在下一段代码中有基本的测试脚本:

#!/bin/bash
# This causes the shell to await user input.
file -
# Need to emulate user input here...

在这种情况下,哪一个shell命令可以模拟用户输入?

谢谢。

2 个答案:

答案 0 :(得分:1)

根据定义,管道cmd1 | cmd2cmd1的标准输出文件描述符连接为cmd2的标准输入文件描述符。

echo foo | file -

这个特殊的例子几乎没用; file命令对于在管道中运行的那种短暂数据运行没有多大意义。一个更有用的示例在文件上运行file。如果您绝对希望文件是标准输入,则可以使用简单的输入重定向。

file - </path/to/example/file

或者你可能正在寻找这个:

file $(locate example/file)

其中locate是一个命令示例,它打印您可能需要的文件的完整路径作为file的实际输入参数。

答案 1 :(得分:1)

您可能需要here document

#!/bin/bash
# This causes the shell to await user input.
file - <<'EOF'
This is what the user
might have typed
if it wasn't in a here document.
${BASH:=head} $(ls | wc -l)
EOF

此处文档继续到仅包含标记词的行。 在示例中,标记词是EOF;您可以选择任何您喜欢的名称(经常使用!)。标记词周围的引号表示不会对此文档进行shell扩展,因此最后一行不会被shell扩展。如果缺少引号(如<<EOF中所示),则会发生shell扩展。这在您需要时非常有用。