在if语句中使用STDIN的bash

在if语句中使用STDIN的bash,bash,shell,unix,conditional,Bash,Shell,Unix,Conditional,如果stdin不等于某个特定的文件,有没有办法输出错误? 例如: 我希望我的stdin等于test.txt ./script.sh < test.txt (should run) 您必须检查文件处理程序0是否重定向到您的文件。您可以这样做: #!/bin/bash me=$$ file=$(readlink -n /proc/$me/fd/0) echo $file if [[ "$file" =~ /x.sh$ ]]; then echo YES else echo NO fi

如果stdin不等于某个特定的文件,有没有办法输出错误? 例如: 我希望我的stdin等于test.txt

./script.sh < test.txt (should run)

您必须检查文件处理程序0是否重定向到您的文件。您可以这样做:

#!/bin/bash

me=$$
file=$(readlink -n /proc/$me/fd/0)
echo $file   
if [[ "$file" =~ /x.sh$ ]]; then echo YES
else echo NO
fi
# Alternate solution
if [[ "$file" == */x.sh ]]; then echo YES
else echo NO
fi
# Another alternate old style bash solution
# if [ "${file##*/}" = x.sh ]; then
首先,它获取运行的PID。然后在virtual/proc文件系统中查找文件处理程序0。
/proc/fd/
中的每个项目都是一个符号链接,可通过
readlink(1)
读取。如果未重定向,则符号链接链接到一个开发文件,如下所示:
/dev/pts/6
如果它被重定向到终端或
管道:[33773]
如果它是管道或
套接字:[36915]
如果它是套接字(如/dev/tcp/ibm.com/80)或
/path/filename
如果文件被重定向。然后,
文件
必须与模式匹配。在我的例子中,我测试了
文件是否等于
x.sh

所以如果你打字的话

$ ./x.sh <x.sh; ./x.sh < y.sh

您必须检查文件处理程序0是否重定向到您的文件。您可以这样做:

#!/bin/bash

me=$$
file=$(readlink -n /proc/$me/fd/0)
echo $file   
if [[ "$file" =~ /x.sh$ ]]; then echo YES
else echo NO
fi
# Alternate solution
if [[ "$file" == */x.sh ]]; then echo YES
else echo NO
fi
# Another alternate old style bash solution
# if [ "${file##*/}" = x.sh ]; then
首先,它获取运行的PID。然后在virtual/proc文件系统中查找文件处理程序0。
/proc/fd/
中的每个项目都是一个符号链接,可通过
readlink(1)
读取。如果未重定向,则符号链接链接到一个开发文件,如下所示:
/dev/pts/6
如果它被重定向到终端或
管道:[33773]
如果它是管道或
套接字:[36915]
如果它是套接字(如/dev/tcp/ibm.com/80)或
/path/filename
如果文件被重定向。然后,
文件
必须与模式匹配。在我的例子中,我测试了
文件是否等于
x.sh

所以如果你打字的话

$ ./x.sh <x.sh; ./x.sh < y.sh

linux
上,是的,但它不可移植:

#in a POSIX shell:
if [ "`readlink /dev/fd/0`" != "$PWD/test.txt" ]; then 
    >&2 echo "Error: stdin should be able to test.txt"
fi

这是因为在linux上,
/dev/fd/0
(或
/proc/self/fd/0
/proc/$$/fd/0
(仅在shell中))是一个符号链接,指向表示您的stdin的文件。
linux
上的,是的,但它不可移植:

#in a POSIX shell:
if [ "`readlink /dev/fd/0`" != "$PWD/test.txt" ]; then 
    >&2 echo "Error: stdin should be able to test.txt"
fi

这是因为在linux上,
/dev/fd/0
(或
/proc/self/fd/0
/proc/$/fd/0
(仅在shell中))是一个符号链接,指向表示stdin的文件。

(AFAIK)我担心这不可能(以简单的方式)作为重定向(管道)由运行
/script.sh
命令的shell设置。运行
script.sh
的shell进程不知道它的stdin管道的另一端是什么);以文件名作为论据。我承认一个错误,答案是正确的。不幸的是,这种方法不适用于例如
cat error.txt |./script.sh
。使用文件名参数的想法非常棒!也许您的脚本应该将自己的stdin重定向到正确的文件,而不是强迫可怜的用户手动键入,然后在出错时抱怨。试着把
exec
放在脚本的开头是的,但问题是我需要完全按照我所说的方式来做练习。因为重定向(管道)是由运行
/script.sh
命令的shell设置的,所以我担心这是不可能的(以简单的方式)。运行
script.sh
的shell进程不知道它的stdin管道的另一端是什么);以文件名作为论据。我承认一个错误,答案是正确的。不幸的是,这种方法不适用于例如
cat error.txt |./script.sh
。使用文件名参数的想法非常棒!也许您的脚本应该将自己的stdin重定向到正确的文件,而不是强迫可怜的用户手动键入,然后在出错时抱怨。试着把
exec
放在脚本的开头是的,但问题是我需要完全按照我所说的方式来做练习。这是给你的school@Joey它将一个字符串与一个匹配。不需要
$me
readlink-n/proc/$$/fd/0
就可以了。@williampersell你说得对。我的版本有点健谈!但是正如PSkicit提到的那样,
/proc/self/fd
也可以工作。@Joey它将字符串与a匹配。不需要
$me
readlink-n/proc/$$$/fd/0
工作得很好。@williampersell你说得对。我的版本有点健谈!但是正如PSkicit提到的
/proc/self/fd
也可以工作。感谢
/dev/fd
解决方案+我为此付出了代价!实际上,这只是到
/proc/self/fd
的符号链接。实际上,
/proc/self
本身是指向
/proc/
的符号链接。因此,所有内容都指向
/proc//fd
;)感谢
/dev/fd
解决方案+我为此付出了代价!实际上,这只是到
/proc/self/fd
的符号链接。实际上,
/proc/self
本身是指向
/proc/
的符号链接。因此,所有内容都指向
/proc//fd
;)