2009-06-03 47 views
5

确定给定ksh调用是否运行交互式shell的首选方法是什么?检测ksh ENV脚本中的交互式shell

我在ENV文件中有一些命令,我​​想跳过非交互式ksh调用(例如执行shell脚本时)。

我见过的提示为from

if [[ $- = *i* ]]; then 
    # do interactive stuff 
fi 

...不,甚至采购.kshrc除非shell决心采用这种神秘incantation是互动:

ENVIRON=$HOME/.kshrc         export ENVIRON 
ENV='${ENVIRON[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}'  export ENV 

回答

2

庆典,这两种方法经常用在~/.bashrc里面:

  • 检查stdin是一个tty:

    [ -t 0 ] || return 
    

    if [ -t 0 ]; then 
        # do interactive stuff 
    fi 
    
  • 检查提示($PS1)设定:

    [ -z "$PS1" ] || return 
    

但我不知道该怎么办在ksh中。

+0

'-t N'测试也在Korn shell中工作。 – 2009-06-03 15:48:28

4

我发现检查' - '的$ - 变量标志着ksh中最好的方法。

if [[ $- = *i* ]]; then 
    #do interactive stuff  
fi 
0

它也可以使用 'TTY -s':运行一个脚本时

The following exit values are returned: 

    0  Standard input is a terminal. 

    1  Standard input is not a terminal. 
0

一个适当的KSH外壳不应以$ ENV。然而,这在Sun的ksh88方言中是一个长期存在的bug,并且实际上在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