在一个(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
方法是迄今为止最可靠和最便携的,因此没有理由使用其他方法。