我有一个从命令行获取输入的函数,并且,可选地,来自标准输入。但是,当没有指定输入流时,它将停止输入。
#!/bin/bash
somefunc() {
# output strings on command line.
while (($#)); do
echo "$1"
shift
done
# take input from stdin, if it exists.
declare line
while read -sr line; do
echo "$line"
done
}
somefunc "$@"
这有效:
$ somefunc "arg1" "arg2" "..." <"/some/file"
这不会:
$ somefunc "arg1" "arg2" "..."
我可以通过在读取命令上使用超时(例如 -t 0.0001)来解决这个问题,但这似乎有点笨拙和脆弱。
有没有更好的方法在不使用超时的情况下实现这一目标?
答案1
使用 -t 的 bash 内置测试应该能够很好地完成这项工作。 [ -t 0 ]
这个链接中有一个很好的例子:
答案2
有两种解决方案,并且都同样快速且不笨拙。
这是我的首选解决方案:
# take input from stdin, if it exists.
if read -t 0; then
declare line
while read -sr line; do
echo "$line"
done
fi
[ -t 0 ] 也有效:
# take input from stdin, if it exists.
if [ -t 0 ]; then
declare line
while read -sr line; do
echo "$line"
done
fi
答案3
也许如果你< /dev/null
在挂起的命令末尾添加。
这将提供命令虚拟输入,以便它可以继续前进,而不会试图干扰您的标准输入。