【问题标题】:How can bash read from piped input or else from the command line argumentbash 如何从管道输入或命令行参数中读取
【发布时间】:2015-04-07 21:42:29
【问题描述】:

我想从管道或命令行参数(比如$1)读取一些数据,以提供的为准(优先级有管道)。

这个片段告诉我管道是否打开,但我不知道在里面放什么以免阻塞脚本(test.sh)(使用readcat

if [ -t 0 ]
then
    echo nopipe
    DATA=$1
else
    echo pipe
    # what here?
    # read from pipe into $DATA
fi

echo $DATA

执行上面的test.sh 脚本我应该得到以下输出:

$ echo 1234 | test.sh
1234
$ test.sh 123
123
$ echo 1234 | test.sh 123
1234

【问题讨论】:

    标签: bash pipe


    【解决方案1】:

    您可以使用以下命令将所有标准输入读入一个变量:

    data=$(cat)
    

    请注意,您所描述的是非规范行为。优秀的 Unix 公民会:

    1. 如果作为参数提供,则从文件名读取(无论 stdin 是否为 tty)
    2. 如果没有提供文件,则从标准输入读取

    这就是您在 sedgrepcatawkwcnl 中看到的内容。


    无论如何,这是您的示例,其中演示了所请求的功能:

    $ cat script 
    #!/bin/bash
    
    if [ -t 0 ]
    then
        echo nopipe
        data=$1
    else
        echo pipe
        data=$(cat)
    fi
    
    echo "$data"
    
    $ ./script 1234
    nopipe
    1234
    
    $ echo 1234 | ./script
    pipe
    1234
    

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多