我有一个小脚本,只要它打开,就应该从标准输入读取数据,但是当我在 Ubuntu 上的 bash 4.4(来自 Docker 镜像)和 bash 4.4 macOS(使用 brew 安装)上运行它时,我会得到不同的行为)
脚本是:
$ cat test.sh
#!/bin/bash
while test -s /dev/stdin; do read A; echo "-- $A --"; done
在 macOS 上,确实如此:
$ (echo one; echo two) | ./test.sh
-- one --
-- two --
在 Ubuntu 上,确实如此:
$ (echo one; echo two) | ./test.sh
# empty output
是否有另一种方法来测试标准输入是否打开且非空?我也尝试过 read
,但它似乎也不太便携。
最佳答案
您可以将所有标准输入读取循环更改为此,以使其在两个系统上都能工作:
[[ ! -t 0 ]] && while IFS= read -r A; do echo "-- $A --"; done
[[ ! -t 0]]
:检查数据是否来自终端。
测试:
$> { echo one; echo two; } | ./test.sh
-- one --
-- two --
$> ./test.sh <<< $'abc\nfoo'
-- abc --
-- foo --
$> ./test.sh
$>
关于bash - Ubuntu Bash 4.4 与 macOS bash 4.4 上的标准输入 `test -s` 不同,是否有可移植替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52875783/