herdoc构造中的shell代码可以访问其父脚本的标准输入吗?

herdoc构造中的shell代码可以访问其父脚本的标准输入吗?,shell,pipe,Shell,Pipe,我在shell脚本foo.sh中有以下构造: 然后,似乎没有办法允许heredocced bash代码访问字符串某物——相反,代码的行为似乎好像其标准输入是一个空的、关闭的文件。有办法解决这个问题吗 [为了避免不可避免的问题,为什么您甚至会……问题,首先使用此结构的原因是,它允许脚本运行,即使文件有CRLF行结尾。实际上,文件的扩展名为.bat,是一个双任务跨平台可执行脚本,可以并用于引导更大的项目。F或者在安装了notepad.exe的新Windows系统上,为了便于人们阅读和编辑,该文件使用

我在shell脚本foo.sh中有以下构造:

然后,似乎没有办法允许heredocced bash代码访问字符串某物——相反,代码的行为似乎好像其标准输入是一个空的、关闭的文件。有办法解决这个问题吗


[为了避免不可避免的问题,为什么您甚至会……问题,首先使用此结构的原因是,它允许脚本运行,即使文件有CRLF行结尾。实际上,文件的扩展名为.bat,是一个双任务跨平台可执行脚本,可以并用于引导更大的项目。F或者在安装了notepad.exe的新Windows系统上,为了便于人们阅读和编辑,该文件使用了Windows样式的行尾。]

herdoc只是纯文本。您可以通过将其输入到bash进程的标准输入中,将其转换为命令脚本。在该bash进程运行时,其标准输入已重定向到tr命令的输出,而这正是bash进程将用作其标准输入的内容。请原谅冗余。这是一个错误运行提供给shell标准输入的脚本的一般问题,与herdocs几乎没有关系

这不是执行bash脚本的唯一方法。例如,您可以使用命名文件,即使该名称假定您的驱动程序使用的是bash或其他支持该语法的shell。这样做可以避免重定向标准输入

bash <(tr -d \\r <<":EOF"
  read line
  echo Hello, "$line"
:EOF
)

如果这太深奥了,你可以将heredoc复制到一个临时文件中,然后找到临时文件的来源。

令人印象深刻-我从来没有想到这是可能的。我想@jez:这不仅仅是bash-ksh和iirc zsh也有它-但它不是Posix。我应该提到这一点,但你使用bash作为标记。谢谢。我想象得到这可能是最好的答案。但我将删除bash标记并暂时不接受,只是为了看看其他人对此是否有想法。@jez:对于posix shell,使用最后一段中的临时文件解决方案。
echo "something" | ./foo.sh
bash <(tr -d \\r <<":EOF"
  read line
  echo Hello, "$line"
:EOF
)