在我的文章中.profile
,我使用以下代码来确保仅在登录shell实际上是Bash时才获得与Bash相关的别名和函数:
# If the current (login) shell is Bash, then
if [ "${BASH_VERSION:-}" ]; then
# source ~/.bashrc if it exists.
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
我目前正在将我的shell配置文件,脚本和函数置于版本控制之下。我也最近开始去除shell脚本不从击的特定功能中受益,如休闲bash化,更换的过程中function funcname()
有funcname()
。
对于我的shell文件存储库,我已经配置了一个预提交钩子,该存储库中的每个文件都运行checkbashisms
Debian的devscripts包中的实用程序,sh
以确保我不会无意中引入Bash特定的语法。但是,这给我带来了一个错误.profile
:
possible bashism in .profile line 51 ($BASH_SOMETHING):
if [ "${BASH_VERSION:-}" ]; then
我想知道是否有一种方法可以检查正在运行的shell,而不会触发checkbashisms
。
我检查了POSIX列出的与外壳相关的变量的列表,希望它们中的一个可以用来显示当前的外壳。我还查看了在交互式Dash shell中设置的变量,但是,再次找不到合适的候选对象。
目前,我已经排除.profile
因被处理checkbashisms
; 这是一个小文件,因此手动检查并不困难。但是,在研究了该问题之后,我仍然想知道是否存在POSIX兼容方法来确定正在运行哪个Shell(或者至少是一种不会导致checkbashisms
失败的方法)。
进一步的背景/说明
我将Shell配置文件置于版本控制下的原因之一是,在我目前定期登录的所有系统上配置环境:Cygwin,Ubuntu和CentOS(5和7,都使用Active Directory作为用户)身份验证)。我最经常通过X Windows /桌面环境和SSH登录远程主机。但是,我希望这是面向未来的方法,并且对系统依赖性和其他工具的依赖最少。
我一直在使用checkbashisms
简单,自动的完整性检查来检查与外壳相关的文件的语法。这不是一个完美的工具,例如,我已经对其应用了补丁,因此它不会抱怨command -v
在脚本中使用。在研究过程中,我了解到该程序的实际目的是确保遵守Debian政策,据我所知,该政策基于POSIX 2004而不是2008(或其2013年修订版)。
.bash_profile
同时.profile
(和(有条件地))来源的.bashrc
。