到底为什么bash <script
不同bash script
?当我使用包含以下内容的脚本尝试此操作时:
cat
hello
world
在第一种情况下,我得到了我的预期:
hello
world
但在第二种情况下,我需要输入 ctrl-D 然后我得到:
script: line 2: hello: command not found
script: line 3: world: command not found
我认为这意味着在第二种情况下 bash 不会将第 2 行和第 3 行读取为 cat 的输入,而是读取为指令。
我认为 bash 参数的处理很简单,但打开相应的文件并使用 dup2() 将该脚本文件设置为文件描述符 0,因此将文件作为参数或作为输入重定向应该不会有太大不同。
bash 是读取整个文件然后逐行执行吗?
答案1
在第一种情况下,将脚本作为标准输入输入 bash:
- bash 运行猫
- cat 从 stdin 读取文件的其余部分并将其复制到 stdout
在第二种情况下:
- bash 运行 cat 命令
- cat 从标准输入(不是文件)读取,直到您按 ctrl-d 关闭 cat
- bash 读取并运行下一行...
请注意,当您像这样在命令行上输入文件名时,通常该文件是 bash 脚本,并被视为程序本身。
另一种方法是将其放入您的文件中:
cat <<EOF
hello
world
EOF
在这种情况下,stdin 由 shell 重定向,并且 cat 将行输入到第二个EOF
.这有时称为 HERE 文档。您可以将 EOF(在两个地方)替换为您想要的任何标记。