为什么使用参数运行 bash 与使用输入文件重定向运行 bash 不同?

为什么使用参数运行 bash 与使用输入文件重定向运行 bash 不同?

到底为什么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(在两个地方)替换为您想要的任何标记。

相关内容