ターミナルで使用しているシェルを確認するにはどうすればよいですか?MacOSで使用しているシェルは何ですか?
echo #SHELLはありません。geekosaurによる回答の#3を参照してください。
xterm -e /bin/cat 、私は/bin/catシェルを呼び出すことを幸せではありません。
ターミナルで使用しているシェルを確認するにはどうすればよいですか?MacOSで使用しているシェルは何ですか?
echo #SHELLはありません。geekosaurによる回答の#3を参照してください。
xterm -e /bin/cat 、私は/bin/catシェルを呼び出すことを幸せではありません。
回答:
最も信頼性の高いものから最も信頼性の低いものまで(および「最も重い」)いくつかの方法:
ps -p$$ -ocmd=。(Solarisでは、これfnameをcmd。の代わりにする必要があります。OSXおよびBSD commandでは、cmd。の代わりにする必要があります。)$BASH_VERSION、$ZSH_VERSIONおよびその他のシェル固有の変数。$SHELL; これは最後の手段であり、デフォルトのシェルを指定し、必ずしも現在のシェルを指定するわけではありません。$0か?
$0もっと複雑だから好きではありません:(1)それはただのベースネームかもしれません、(2)ログインシェルとしてそれを指定するためにフロントに '-'があるかもしれません。
ps -p$$ -ocmd=""きれいです:-)
$0それでもなおより便利だと思われます$SHELL:あなたは同意しませんか?常にパイプでsed「-」を削除できます。
tcsh、$tcshおよび$version設定されます。これらは環境変数ではなく、シェル変数です。の非tcshバージョンを実行している場合csh、特徴的な変数はないと思います。そしてもちろん、変数をチェックするために使用される構文は、一方でcsh / tcshと、他方でsh / ksh / bash / zshとで異なります。
いくつかのより軽い実装(Android電話、busyboxなど)についての注意:スイッチをps常にサポートしているわけではありませんが-p、のようなコマンドで検索を実行できますps | grep "^$$ "。(このgrep正規表現はPIDを一意に識別するため、誤検出はありません。
ps | grep $$たとえば、現在のプロセスが1234あり、プロセスが存在する場合は、依然として誤検知が発生する可能性があります12345。
本当に簡単な方法が2つあります。
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)
これは、スクリプト、ソースコード、またはターミナルを使用している場合でも、使用中のシェルインタープリターのバイナリへのリンクとして常に同じ結果をもたらす唯一のオプションです。
警告これにより最終的なバイナリが表示されるため、kshがksh93にリンクされるか、shがbashにリンクされる場合があることに注意する必要があります。
の使用方法は、現在のコマンドのPIDにリンクするを/proc介して非常に便利です/proc/self。
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.
環境変数に保存している場合は、次を使用できます。
echo $SHELL
実行中のシェルのPIDは、var $$(ほとんどのシェル)によって指定されます。
whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"
バックティックを使用してjsh(Heirlommシェル)を機能させる。
多くのシェルでは、直接テストps -o args= -p $$がbusybox ash機能しますが、それで失敗します(解決済み)。
$1等しくなければならないチェック$$は、ほとんどの誤検知を取り除きます。
最後;:は、kshとzshのシェルを実行し続けるために使用されます。
より多くのシステムでのテストが役立ちます。うまくいかない場合はコメントしてください。
cshシェルのタイプでは機能しません。
/usr/lib/dyldです/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それはそう根本的に異なる(したがって警告と5秒間のポーズが)ですので、セクションでは、POSIXスタイルのスクリプトに転がり賢明そうです。(1の場合、cshスタイルシェルは行うことができない2>/dev/nullか、>&2有名に述べたように、有害と考えられCSHプログラミング暴言。)