【问题标题】:BASH - Storing stdin reference '&0' in variableBASH - 将标准输入引用“&0”存储在变量中
【发布时间】:2013-10-14 13:08:47
【问题描述】:

试图从文件或标准输入中读取,我想做这样的事情:

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

但如果我这样做了

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

我明白了

&0: No such file or directory

从命令行

cat <&0

完美运行,有没有办法将标准输入引用存储在变量中?
PS:我知道可以通过简单的方式实现相同的结果...

【问题讨论】:

    标签: bash redirect stdin


    【解决方案1】:

    cat 有时会有用处,这可能就是其中之一:

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

    像这样记录您使用cat 的原因;否则,它看起来像 UUOC(无用的 Cat)。

    【讨论】:

    • +1 干净地处理$1 保证包含文件名或标准输入的情况。
    • 它(cat $1)在没有$1的情况下也有效,当然是再次读取标准输入。如果您保证文件名或破折号但文件名可能包含空格,您将使用cat "$1"
    【解决方案2】:

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

    而不是说:

    INPUTFILE="&0"
    

    说:

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

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

    【讨论】:

    • 是的,我没想过使用 /proc。
    • 应告知非 Linux 用户/proc 可能不可用。
    • @chepner 我必须说你继续启发我们所有人。
    • 正如@Bruno 指出的那样,也许最短的方法(Linux 用户)是使用 /dev/stdin
    【解决方案3】:

    &amp;0 不是文件名,但它是使用文件描述符进行 I/O 重定向的符号的一部分:您应该将&lt;&amp;0 作为一个整体来阅读。

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

    【讨论】:

    • 我知道这不是文件名,我想知道是否有办法将标准输入存储在 var 中,正如@devnull 告诉我的那样;)
    • 啊,还有/dev/stdin/dev/stdout/dev/stderr可以作为文件使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多