【问题标题】:Duplicated usage of stdin in bash [duplicate]在 bash 中重复使用标准输入 [重复]
【发布时间】:2019-12-24 23:51:55
【问题描述】:

我想给 awk 两个输入文件,它们都包含标准输入的内容。当我尝试这样做时,发生了奇怪的事情。所以我通过在标准输入上回显一些输入来模拟实验,结果也没有按预期工作。

echo 88 | awk '1' - - 

88

 echo 88 | tee outfile | awk '1' - - 

还是给88。

echo 88 | tee outfile | awk '1' - outfile

正确打印 88 两次

但是 T 恤应该是不必要的,不是吗?

【问题讨论】:

  • 为什么不echo 88 | awk '{print $0,$0}'简单呢?
  • 寻找解释为什么第一个例子不起作用。它应该给 awk 两行输入,但只有一个输出。
  • 破折号 (-) 表示stdin 流已被消耗,因此当您第二次访问它时,其中将没有任何内容。或者您是否希望在阅读时不会得到所有stdin
  • 请注意,将 - 替换为 /dev/stdin 仍然不起作用。这也是你所期望的吗?
  • 你不能两次从同一条河里喝水。

标签: bash awk stdin


【解决方案1】:

标准输入是一个流;你消费的东西将永远从中删除。您可以做的是将标准输入保存到一个临时文件中,然后在完成后将其删除。

#!/bin/sh
# Nothing here is Bash-specific
# Create a temporary file; fail if it can't be done
t=$(mktemp -t savestdin.XXXXXXXXX) || exit
# Set up an exit trap to remove the temporary file
trap 'rm -f "$t"' EXIT
trap 'exit 126' HUP INT TERM
# Save input
cat >"$t"
# Your stuff here
awk '1' "$t" "$t"

【讨论】:

  • 我认为这就是我在上一个示例中对 tee 所做的。
  • 差不多,除了你在系统中乱扔临时文件,但无法删除,
  • 是的,这只是一个说明性的例子,而不是真正的代码。
猜你喜欢
  • 2015-04-29
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多