我有一个第三方shell函数,它试图使用tty -s来检测它是否是从交互式shell调用的,但是报告说它在一个交互的shell中,即使它不是。
#!/usr/bin/env bash
get_shell_type() {
tty -s && echo "INTERACTIVE" || echo "NON-INTERACTIVE"
}为什么要这样做呢?我怎么才能修好它?
发布于 2020-12-12 14:12:28
这可能是试图确定是否正在将输出写入交互式终端,而不是确定shell本身是否是交互式的。
如果是这样的话,它是一个较慢/效率较低/效率较低的程序,相当于以下内容:
get_shell_type() {
if [[ -t 0 ]]; then echo INTERACTIVE; else echo NON_INTERACTIVE; fi
}如果目标是确定一个shell是否是交互式的,那么它就是错误的。
shell是否是交互式的取决于它的stdin是否连接到TTY (在不清楚的情况下用作猜测的启发式),但是在完成所有试探之后,最终的决定反映在set -i是否是活动的。与所有其他set标志一样,活动的标志可以在$-中看到。因此:
get_shell_type() {
case $- in *i*) echo "INTERACTIVE";; *) echo "NON-INTERACTIVE";; esac
}另请参阅:
https://stackoverflow.com/questions/65265637
复制相似问题