这 2 个 bashrc 交互性检查有什么区别?

这 2 个 bashrc 交互性检查有什么区别?

在一个(Debian shell)中我有:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

在另一个(Debian shell)中我有:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

它们有什么区别?现在我应该选择哪一种?

答案1

i特殊参数中的test for 测试$-当前 shell 是否作为交互式 shell 启动。

测试$PS1(主提示字符串)是否为空(大多数情况下)也可以在 bash shell(且仅该 shell)中用于检测 shell 是否意外交互,因为:

  • $PS1如果 bash 没有作为交互式 shell 启动,则它会忽略环境中的 a ,即使在 bash 仍然读取的情况下~/.bashrc(例如ssh在 bash 的某些非默认版本中重新启动或~/.bashrc显式获取源时)。
  • $PS1在交互式调用中,如果环境中没有,则bash设置$PS1"\s-\v\$ "

所以在 中bash$PS1通常在交互时设置,在非交互时取消设置。

但是,如果存在一个$BASH_ENV设置的文件$PS1(因为$BASH_ENV即使通过非交互式调用也会解释文件),或者$PS1环境中存在空值,或者在设置了一个~/.bashrc后由非交互式 shell 获取,则该黑客攻击会失败。PS1原因或其他(例如/etc/profile用于非交互式登录 shell 的 via),尽管所有这些在实践中都不太可能。

在类似 Korn 的 shell(ksh88、ksh93、pdksh、mksh、oksh、bash、zsh...)中,您也可以执行[[ $- = *i* ]]or [[ -o interactive ]](但后者不能bash)。

但这种case $- in (*i*)...; esac方法是迄今为止最可靠和最便携的,因此没有理由使用其他方法。

相关内容