在if语句中使用STDIN的bash
如果stdin不等于某个特定的文件,有没有办法输出错误? 例如: 我希望我的stdin等于test.txt在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
./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
;)