【问题标题】:Read from a file and stdin in Bash在 Bash 中从文件和标准输入中读取
【发布时间】:2017-10-29 01:55:50
【问题描述】:

我想知道我是否可以编写一个shell 脚本,它同时接受两个参数,一个来自文件,另一个来自标准输入。可以举个例子吗?

我在尝试

while read line
   do
   echo "$line"
done < "${1}" < "{/dev/stdin}"

但这不起作用。

【问题讨论】:

  • “来自文件和标准输入的参数”是什么意思?您的意思是从作为参数传递的文件中读取数据?
  • 交错内容(来自文件的一行,来自标准输入的一行,来回切换)?连接它们?更具体一点——我们可能有一个重复,一旦提供了足够的细节。

标签: bash stdin


【解决方案1】:

您可以使用cat -cat /dev/stdin

while read line; do
  # your code
done < <(cat "$1" -)

while read line; do
  # your code
done < <(cat "$1" /dev/stdin)

或者,如果您想读取通过命令行传递的所有文件以及标准输入,您可以这样做:

while read line; do
  # your code
done < <(cat "$@" /dev/stdin)

另见:

【讨论】:

  • 我需要 bash 脚本同时接受这两个参数。我以前的第二个例子不起作用。我创建了 test.txt,然后我制作了 bash myprogram.sh test.txt 任何东西。但我只从文件中获取内容,而不是从标准输入(任何东西)
  • @Juan 是什么?你希望stdin 文字被推断为标准输入?
  • 更新了答案以处理通过命令行传递的所有参数(文件名)。
  • @Juan, ...另外,“不起作用”根本不是一个足够的错误报告。这可能不起作用的一些原因可能与使用错误的 shell 执行(sh 不支持进程替换语法)或输入时的拼写错误或语法错误有关。上面给出的评论不足以诊断任何这些情况 - 需要明确的是,这里给出的代码确实在正确和正确部署时工作。
  • @codeforester 这个代码
【解决方案2】:

This topic 在这里似乎很有帮助:

{ cat $1; cat; } | while read line
   do
   echo "$line"
done

或者只是

cat $1
cat

如果您所做的只是打印内容

【讨论】:

  • cat "$1",你的意思是。否则带有空格的文件名将无法使用。而你只需要cat的一个实例,因为标准输入可以称为-,如下:cat "$1" -
  • 顺便说一句,我建议done &lt; &lt;(cat "$1" -) 而不是cat "$1" - | while 以避免BashFAQ #24
最近更新 更多