5

确定给定 ksh 调用是否正在运行交互式 shell 的首选方法是什么?

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

我已经看到建议范围

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

...甚至不采购,除非使用这种神秘的咒语.kshrc确定外壳是交互式的:

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

4 回答 4

5

我发现检查 $- 变量中的 'i' 标志是 ksh 中的最佳方法。

if [[ $- = *i* ]]; then
    #do interactive stuff     
fi
于 2011-07-22T19:43:57.933 回答
2

bash里面,这两种方法经常用到~/.bashrc

  • 检查是否stdin是 tty:

    [ -t 0 ] || return
    

    或者

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

    [ -z "$PS1" ] || return
    

但我不知道如何在 ksh 中做到这一点。

于 2009-06-03T15:08:04.913 回答
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

当来自交互式外壳时,它会做正确的事情:

$ . ./interactive.sh
$- = imsBEl
interactive
于 2012-09-07T09:32:38.687 回答
0

也可以使用'tty -s':

The following exit values are returned:

  0        Standard input is a terminal.

  1        Standard input is not a terminal.
于 2012-06-13T15:56:13.020 回答