确定给定的ksh调用是否正在运行交互式shell的首选方法是什么?
我在ENV
文件中有一些命令,我想跳过非交互式ksh调用(例如执行shell脚本时)。
我见过建议范围为from:
if [[ $- = *i* ]]; then
# do interactive stuff
fi
...甚至不采购.kshrc
,除非使用这个神秘的incantation确定shell是交互式的:
ENVIRON=$HOME/.kshrc export ENVIRON
ENV='${ENVIRON[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}' export ENV
答案 0 :(得分:4)
我发现检查$ - 变量,'i'标志着ksh中的最佳方法。
if [[ $- = *i* ]]; then
#do interactive stuff
fi
答案 1 :(得分:2)
在 bash 中,这两种方法通常在~/.bashrc
内使用:
检查stdin
是否为tty:
[ -t 0 ] || return
或
if [ -t 0 ]; then
# do interactive stuff
fi
检查是否设置了提示($PS1
):
[ -z "$PS1" ] || return
但我不知道如何在ksh中这样做。
答案 2 :(得分:0)
也可以使用'tty -s':
The following exit values are returned:
0 Standard input is a terminal.
1 Standard input is not a terminal.
答案 3 :(得分:0)
运行脚本时,正确的KSH shell不应调用$ ENV。然而,这是Sun的ksh88
方言中长期存在的错误,并且实际上在Solaris 10中被修补了。(相当令人惊讶的是,因为Sun传统上非常不愿意改变现有行为,因为这样的修复可能会破坏变通方法。在这种情况下,标准占了上风。)
为了防止sun的ksh88在运行脚本时读取$ ENV,通常使用#!/bin/ksh -p
解决方法,如果你没有/etc/suid_profile
,那就很安全。
但是,$ - 是交互式shell的可靠指标,除非你伪造它。
$ cat interactive.sh
echo \$- = $-
[[ $- == *i* ]] && echo interactive || echo not interactive
当作为脚本运行时,它给出:
$ ksh interactive.sh
$- = hB
not interactive
当我们伪造-i
标志时,你得到你要求的东西:
$ ksh -i interactive.sh
$- = imBE
interactive
当从交互式shell中获取时,它会做正确的事情:
$ . ./interactive.sh
$- = imsBEl
interactive