如何确定我正在使用的当前shell ?
仅仅ps命令的输出就足够了吗?
如何在不同风格的Unix中实现这一点?
如何确定我正在使用的当前shell ?
仅仅ps命令的输出就足够了吗?
如何在不同风格的Unix中实现这一点?
当前回答
有许多方法可以找到shell及其对应的版本。下面是一些对我有用的方法。
直截了当的
$> echo $0(给你程序名。在我的例子中,输出是-bash。) $> $SHELL(这将带您进入SHELL,并在提示符中获得SHELL名称和版本。在我的情况下bash3.2$。) $> echo $SHELL(这将给你可执行的路径。在我的情况下/bin/bash。) $> $SHELL——version(这将提供有关许可证类型的SHELL软件的完整信息)
独创性的方法
$> *******(输入一组随机字符,在输出中您将获得shell名称。在我的例子中-bash: chapter2-a-sample-isomorphic-app: command not found)
其他回答
不需要从"ps"的输出中Grepping PID,因为你可以从/proc目录结构中读取任何PID的相应命令行:
echo $(cat /proc/$$/cmdline)
然而,这可能并不比简单地:
echo $0
关于运行一个与名称不同的shell,一个想法是使用之前获得的名称从shell请求版本:
<some_shell> --version
sh似乎失败的退出码2,而其他人给出一些有用的(但我无法验证所有,因为我没有他们):
$ sh --version
sh: 0: Illegal option --
echo $?
2
使用$SHELL环境变量获取它。简单的sed可以删除路径:
echo $SHELL | sed -E 's/^.*\/([aA-zZ]+$)/\1/g'
输出:
bash
它在macOS、Ubuntu和CentOS上进行了测试。
如果你只是想确保用户正在使用Bash调用脚本:
if [ -z "$BASH" ]; then echo "Please run this script $0 with bash"; exit; fi
或参考
if [ -z "$BASH" ]; then exec bash $0 ; exit; fi
我尝试过许多不同的方法,对我来说最好的方法是:
ps -p $$
它也可以在Cygwin下工作,并且不能像PID grepping那样产生假阳性。经过一些清理,它只输出一个可执行名称(在Cygwin With path下):
ps -p $$ | tail -1 | awk '{print $NF}'
你可以创建一个函数,这样你就不必记住它:
# Print currently active shell
shell () {
ps -p $$ | tail -1 | awk '{print $NF}'
}
…然后执行shell。
它在Debian和Cygwin下进行了测试。
在Mac OS X(和FreeBSD)上:
ps -p $$ -axco command | sed -n '$p'