Bash/csh:测试 stdin 的文件结尾 (EOF)

Ole*_*nge 5 bash eof stdin

我想要做:

if not eof(stdin):
   pass stdin to program
else:
   do nothing
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,它可以写得相当接近:

if test ! --is-eof - ; then
  exec program
Run Code Online (Sandbox Code Playgroud)

我试图解决的问题是program从标准输入读取,但如果没有输入就会崩溃。我无权访问源代码,program因此program无法更改。二进制输入大于内存大小,因此首先将标准输入放入文件的速度慢得令人无法接受。在 bash 中逐行处理所有输入的速度也慢得令人无法接受。

理想情况下,该解决方案应该在 csh 和 bash 下都能工作。

Ole*_*nge 2

这似乎在 csh 和 bash 中都有效,并且可以很好地处理二进制输入(也可以将 \0 作为第一个字符):

# Set $_FIRST_CHAR_FILE to the name of a temp file.
eval `echo $SHELL | grep -E "/(t)?csh" > /dev/null && echo setenv _FIRST_CHAR_FILE /tmp/$$.first_char_file || echo export _FIRST_CHAR_FILE=/tmp/$$.first_char_file`

dd bs=1 count=1 of=$_FIRST_CHAR_FILE >&/dev/null
test -s "$_FIRST_CHAR_FILE" && ( cat $_FIRST_CHAR_FILE; rm $_FIRST_CHAR_FILE; cat - ) | program
Run Code Online (Sandbox Code Playgroud)

感谢 @glenn-jackman 提出了在将这个和 stdin 的其余部分传递给 之前阅读一点的想法cat