gpt4 book ai didi

unix - ksh:如何探测标准输入?

转载 作者:行者123 更新时间:2023-12-05 00:43:56 26 4
gpt4 key购买 nike

我希望我的 ksh 脚本具有不同的行为,具体取决于是否有通过 stdin 传入的内容:

    (1) cat file.txt | ./script.ksh  (then do "cat <&0 >./tmp.dat" and process tmp.dat)
vs. (2) ./script.ksh (then process $1 which must be a readable regular file)

检查 stdin 以查看它是否是终端 [ -t 0 ] 没有帮助,因为我的脚本是从其他脚本调用的。

如果标准输入为“空”(第二种情况),执行“cat <&0 >./tmp.dat”来检查 tmp.dat 的大小会挂断等待来自标准输入的 EOF。

如何只检查 stdin 是否为“空”?!

最佳答案

编辑:您正在 HP-UX 上运行

在 HP-UX 上测试了 [ -t 0 ],它似乎对我有用。我使用了以下设置:
/tmp/x.ksh:

#!/bin/ksh
/tmp/y.ksh
/tmp/y.ksh:
#!/bin/ksh
test -t 0 && echo "terminal!"

运行 /tmp/x.ksh 打印: terminal!
您能否在您的平台上确认上述内容,和/或提供更能反射(reflect)您情况的替代测试设置?你的脚本最终是由 cron 产生的吗?

编辑 2

如果绝望,并且 Perl 可用,请定义:
stdin_ready() {
TIMEOUT=$1; shift
perl -e '
my $rin = "";
vec($rin,fileno(STDIN),1) = 1;
select($rout=$rin, undef, undef, '$TIMEOUT') < 1 && exit 1;
'
}

stdin_ready 1 || 'stdin not ready in 1 second, assuming terminal'

编辑 3

请注意,如果您的输入来自 sortssh 等,则超时可能需要很大(所有这些程序都可以在生成任何数据之前用脚本生成并建立管道几秒或几分钟。)此外,使用大量超时当输入中没有任何内容时(例如终端),可能会极大地惩罚您的脚本。

如果潜在的大超时是一个问题,并且如果您可以影响调用脚本的方式,那么您可能希望通过自定义选项或标准 GNU 强制调用者明确指示您的程序是否应使用 stdin或 tar 方式(例如脚本 [options [--]] FILE ...,其中 FILE 可以是文件名、表示标准输入的 - 或其组合,如果 - 为作为参数传入。)

关于unix - ksh:如何探测标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/635361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com