在ksh ENV脚本中检测交互式shell

时间:2009-06-03 15:04:18

标签: shell unix ksh

确定给定的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

4 个答案:

答案 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