2013-10-14 243 views
2

试图从文件或标准输入读取标准输入参考“&0”,我愿做这样的事情:BASH - 存储变量

if [ "$1" == "-" ] 
    then 
    INPUTFILE="&0" 
fi 

但如果我这样做

while read ROW 
    do 
    # ... something 
done <$INPUTFILE 

&0: No such file or directory 

从命令行

cat <&0 

完美工作,有没有办法将stdin参考存储在变量中?
PS:我知道同样的结果可以以简单的方式实现......

回答

4

有些时候cat有它的用途,这可能是其中之一:

# Use cat so it works if $1 is just - 
cat $1 | 
while read ROW 
do 
    ...whatever 
done 

文件为什么要使用cat这样;否则,它看起来像一个UUOC(无用的猫)。

+0

+1干净利落地处理'$ 1'保证包含文件名或标准输入的情况。 – chepner

+0

这是优雅的,我想我忘了猫接受冲刺。 – tonjo

+0

它('cat $ 1')也适用于没有$ 1的情况,当然,再次读取标准输入。如果你保证文件名或短划线,但文件名可能包含空格,你可以使用'cat'$ 1“'。 –

0

&0不是一个文件名,但它的符号使用文件描述符的I/O重定向的一部分:你应该读<&0为整个。

你可以在this document找到更多详细信息。

+0

我知道这不是一个文件名,我想知道是否有一种方法可以将stdin存储在var中,就像@devnull告诉我的那样) – tonjo

+1

啊,还有'/ dev/stdin','/ dev/stdout'和'/ dev/stderr'你可以用作文件。 – Bruno

2

这不起作用,因为shell将&0解释为文件名。

不要说:

说:

INPUTFILE="/proc/$$/fd/0" 

这将使它从当前shell进程的STDIN读取。

+0

是的,我不认为使用/ proc。 – tonjo

+0

非Linux用户应该被告知'/ proc'可能不可用。 – chepner

+0

@chepner我必须说,你们继续启发我们所有人。 – devnull