如何检查终端中使用的shell?我在MacOS中使用的外壳是什么?
xterm -e /bin/cat
但我不满意调用/bin/cat
Shell。
如何检查终端中使用的shell?我在MacOS中使用的外壳是什么?
xterm -e /bin/cat
但我不满意调用/bin/cat
Shell。
Answers:
从最可靠到最不可靠(以及最不重要)的几种方法:
ps -p$$ -ocmd=
。(在Solaris上,可能需要用fname
代替cmd
。在OSX和BSD上应该用command
代替cmd
。)$BASH_VERSION
,$ZSH_VERSION
以及其他特定壳的变量。$SHELL
; 这是不得已的方法,因为它指定了默认的 Shell,而不必指定当前的 Shell。$0
也要提吗?
$0
因为它更复杂:(1)它可能只是基本名称,(2)可能在其前面带有“-”以将其指定为登录外壳。
ps -p$$ -ocmd=""
更漂亮:-)
$0
似乎比$SHELL
:还有用:您不同意吗?您始终可以通过管道将sed
其删除以删除“-”。
tcsh
,$tcsh
并且$version
将被设置。这些是外壳变量,而不是环境变量。如果您运行的是非tcsh版本的csh
,我认为没有任何明显的变量。当然,一方面,用于检查变量的语法在csh / tcsh和另一方面在sh / ksh / bash / zsh之间是不同的。
有两种非常简单的方法:
使用ps命令:
ps -o comm= $$
要么
ps -h -o comm -p $$
哪里:
-h
或用=
不显示任何标题结束所有选项。-o comm
用于仅显示进程的基本名称(bash
而不是/bin/bash
)。-p <PID>
仅列出带有PID表单列表的进程。使用/ proc进程信息伪文件系统:
cat /proc/$$/comm
此选项的行为与ps
上面的命令完全相同。
要么
readlink /proc/$$/exe
这/proc/PID/exe
链接到正在执行的文件,在这种情况下,该文件将指向/ bin / bash,/ bin / ksh等。
仅获取外壳的名称,您可以使用
basename $(readlink /proc/$$/exe)
这是唯一的选项,即使您位于脚本,源代码或终端中,也始终会得到与使用中的Shell解释器二进制文件链接相同的结果。
警告您必须注意,这将显示最终二进制文件,因此ksh可能链接到ksh93或sh链接到bash。
/proc
通过/proc/self
链接到当前命令的PID 的,使用确实有用。
与Mac(comm),Solaris(fname)和Linux(cmd)兼容的所有其他答案:
ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1
csh
,tcsh
它给了我Ambiguous output redirect.
正在运行的shell的pid由var $$(在大多数shell中)给出。
whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"
使用反引号使jsh(Heirlomm shell)起作用。
在许多外壳中,直接测试是ps -o args= -p $$
可行的,但busybox ash
在此方面却失败了(解决)。
$1
必须等于的支票$$
会删除大多数误报。
最后一个;:
用于使shell在ksh和zsh上运行。
在更多系统上进行测试会有所帮助,如果对您不起作用,请发表评论。
在csh
外壳类型中不起作用。
/usr/lib/dyld
,1行用于/private/var/db/dyld/dyld_shared_cache_x86_64
。
我准备$MYSHELL
在与外壳无关的情况下进行将来的测试~/.aliases
:
unset MYSHELL
if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then # zsh
MYSHELL=`command -v zsh`
elif [ -x "$BASH" ] && shopt -q >/dev/null 2>&1; then # bash
MYSHELL=`command -v bash`
elif [ -x "$shell" ] && which setenv |grep builtin >/dev/null; then # tcsh
echo "DANGER: this script is likely not compatible with C shells!"
sleep 5
setenv MYSHELL "$shell"
fi
# verify
if [ ! -x "$MYSHELL" ]; then
MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
[ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}" # default if verify fails
fi
该tcsh
部分可能根本不明智,因为它与POSIX样式的脚本大相径庭(因此警告和五秒钟的暂停)。(例如,如著名的Csh编程认为有害之类中所述,csh
-style的shell不能2>/dev/null
或。)>&2