1. ホーム
  2. bash

zsh や bash を使ってシェルの自己検出を行う方法

2023-08-05 18:40:16

質問

ユーザがどのシェルを使っているかを知る方法について質問があります。もしユーザーがzshを使用している場合、PATHを彼の .zshrc に、bash を使用している場合は .bashrc に置くとします。そして、それに応じて rvmrc を設定します。

#!/usr/bin/env bash
export PATH='/usr/local/bin:$PATH' >> ~/.zshrc
source ~/.zshrc

を試してみましたが、うまくいきません : (

if [[ $0 == "bash" ]]; then
  export PATH='/usr/local/bin:$PATH' >> ~/.bashrc
elif [[ $0 == "zsh" ]]; then
  export PATH='/usr/local/bin:$PATH' >> ~/.zshrc
fi

# ... more commands ...

if [[ $0 == "bash" ]]; then
  [[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm' >> ~/.bashrc
  source ~/.bashrc
elif [[ $0 == "zsh" ]]; then
  [[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm' >> ~/.zshrc
  source ~/.zshrc
fi

どのように解決するのですか?

注意:あなたが尋ねたと思われる質問、あなたが尋ねようとした質問、あなたが尋ねるべき質問は、3つの異なるものです。

「ユーザーがどのシェルを使用しているか」はあいまいです。あなたの試みは、どのシェルがスクリプトを実行しているかを判断しようとしているように見えます。それは常に、あなたが #! 行に記述したものであり、ユーザーがそのスクリプトを編集することを意図していない限り、これはあなたにとって有益ではありません。

あなたが聞きたいことは、ユーザーの好きなシェルが何であるかということだと思います。これは完全に信頼できる決定ではありませんが、ほとんどのケースをカバーすることができます。この場合 SHELL 環境変数をチェックしてください。もしそれが fish , zsh , bash , ksh または tcsh であれば、ユーザの好きなシェルはそのシェルであると思われます。しかし、これはあなたの問題に対する間違った質問です。

のようなファイルは .bashrc , .zshrc , .cshrc などはシェルの初期化ファイルです。環境変数を定義する場所としては適切ではありません。そこで定義された環境変数は、ユーザーがそのシェルを起動したターミナルでのみ利用可能で、GUI から起動したプログラムでは利用できません。また、その定義は、ユーザーがサブセッションで行ったかもしれないいかなるカスタマイズも上書きします。

環境変数を定義する正しい場所は、セッションのスタートアップ ファイル内です。これは、ユーザーのシェルの選択とはほとんど無関係です。残念ながら、環境変数を定義するための唯一の場所はありません。多くのシステムで ~/.profile で動作しますが、これは普遍的なものではありません。参照 https://unix.stackexchange.com/questions/4621/correctly-setting-environment と、そこにリンクしている他の投稿を参照してください。