zsh や bash を使ってシェルの自己検出を行う方法
質問
ユーザがどのシェルを使っているかを知る方法について質問があります。もしユーザーが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
と、そこにリンクしている他の投稿を参照してください。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] Bashで変数が設定されているかどうかを確認する方法は?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Makefileでシェルコマンドを使用する方法
-
[解決済み] コマンドライン・ターミナルでの乗算
-
[解決済み] homebrew パッケージがインストールされているかどうかを検出する
-
[解決済み] Bashの履歴にコマンドを表示させないようにするには?
-
[解決済み] ENV 変数やデフォルト値を使って Makefile の変数を定義する
-
[解決済み] ループ内でユーザー入力を読み取る
-
[解決済み] Bashのコマンドラインと入力制限
-
[解決済み] シェルのワイルドカード文字展開を停止しますか?
-
[解決済み] Bash。フォルダ構造を保持したまま再帰的に名前付きファイルをコピーする
-
[解決済み] 予期しないbashの終了時に作成された一時ファイルを削除する