chsh -s /usr/local/bin/zsh
新しいデフォルトシェルを設定するようなものを実行できます。そのシェルが何であるかを知るために実行できるコマンドはありますか?
ターミナルを開いてコマンドを実行して、現在のシェルを知るという意味ではありません。上記の例のように、開いているターミナルにいる場合、それが現在のものである場合/bin/bash
、何を実行して取得する必要がありますか/usr/local/bin/zsh
デフォルトのシェル?
macOS の場合:
dscl . -read /Users/username UserShell
現在の macOS ユーザーの場合:
dscl . -read ~/ UserShell
を使用してインラインでパスを解析するにはsed
:
dscl . -read ~/ UserShell | sed 's/UserShell: //'
を使用$SHELL
すると、デフォルトのログイン シェルではなく、現在のログイン シェルが報告されます。場合によっては、これらは同じではありません。たとえば、デフォルトのシェルを参照せずに統合ターミナルを開く Visual Studio Code などの IDE で作業する場合です。
さらに、Martin C. Martin が指摘したように、デフォルトのログイン シェルを変更した$SHELL
後も変更されない定数です。chsh
/etc/passwd ファイルで現在のユーザー名を grep し、cut を使用して適切な情報の列を抽出できます。
grep ^$(id -un): /etc/passwd | cut -d : -f 7-
$(id -un)
$USER
ユーザー名を取得するよりも安全です。^
ユーザー名の前と後に使用:
すると、ユーザー名が他のユーザー名のサブセクションである場合に、誤った一致が得られないようになります。
$SHELL
提案されているように、使用することもできます。ただしchsh
、変数が更新されないため、現在のシェルで使用された場合は機能しません。また、変数は変更に対して保護されていないため、理論的にはまったく異なるものに設定できます。
OS X と互換性のあるソリューションを試すために更新します。おそらく最適な正規表現ではありません:
grep ^.*:.*:$(id -u): /etc/passwd | cut -d : -f 7-
これは、ユーザー ID に基づいています。ユーザー名だけでなく、ユーザーエントリ全体が欠落している場合、osx はこれを別の場所に保存する必要があります。
ユーザーのデフォルト シェルを取得する場合は、 grep fileを実行できます/etc/passwd
。お気に入り:
grep "$USER" /etc/passwd
# kent:x:1000:1000::/home/kent:/bin/zsh
現在のユーザー (ケント) がデフォルトの shell を持っていることを教えてくれます/bin/zsh
。
シェル部分だけをキャッチしたい場合:
awk -F: -v u="$USER" 'u==$1&&$0=$NF' /etc/passwd
# /bin/zsh
他のユーザーのデフォルト シェルを取得する場合は、$USER の部分を置き換えるだけです。