bash - Ubuntu Bash 4.4 与 macOS bash 4.4 上的标准输入 `test -s` 不同,是否有可移植替代方案?

标签 bash macos ubuntu io posix

我有一个小脚本,只要它打开,就应该从标准输入读取数据,但是当我在 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/

相关文章:

bash - 如何在 ${@ :3} shell script 之后接受参数

bash - 通过树莓派上的 Chrome 标签旋转?

macOS Kext 与有效签名在第二次安装后被拒绝( Alpine 脉)

iphone - 添加自定义 UITableViewCell 会使模拟器崩溃

swift - NSGridView 困难

bash - 为什么这个自定义采购函数不能使我声明的变量全局可用?

linux - Bash:将文件中的特定内容行移动到文件顶部

linux - 在带有屏幕和 nohup 的 Linux 机器上远程运行脚本在注销后不久被终止

c++ - 用于查看互联网连接和构建防火墙的 Shell 脚本或 C++ 库

linux - 在网络服务器上设置 Linux 机器