![SHELL="/bin/bash" と SHELL="bash"](https://rvso.com/image/1648608/SHELL%3D%22%2Fbin%2Fbash%22%20%E3%81%A8%20SHELL%3D%22bash%22.png)
SHELL="/bin/bash" と SHELL="bash" のエクスポートの違いは何ですか? 以前はexport SHELL="bash"
.bashrc にありました。 うまく機能しているようでした。 $($SHELL) はサブシェルを生成しましたが、公開キー認証を使用した ssh ではエラーが発生しました:Shell "bash" is not executable: No such file or directory
答え1
$($SHELL)
サブシェルを生成した
はい、シェル$SHELL
(またはより良い "$SHELL"
) は、/bin/bash
またはbash
あなたの場合は、両方が Bash を生成するように拡張されます。
補足: を使用すると$($SHELL)
、新しいシェルからの出力はシェルの終了後に実行されます。これはコマンド置換 ( $( … )
) の仕組みによるものです。コマンド置換あまり意味がないここでは、あなたの主張を示す必要はありません。
SHELL="bash"
あなたの主張は、"$SHELL"
が Bash を実行すると、他のツール (SSH サーバー?) がエラーを発生するということのようです。
どのツールが苦情を申し立てているのかは不明です。また、SHELL
クライアント側で改ざんされたのか、サーバー側で改ざんされたのかは不明です。マクベ質問では、 を設定する必要がある理由も明確ではありませんSHELL
。.bashrc
私はこれらについて調査するつもりはありません。
とSHELL
の違いについてお話しします。/bin/bash
bash
一般的に。
環境変数の目的SHELL
は、使用したいシェルを指定することです。さまざまなソフトウェアが、何らかの理由で選択したシェルを実行するために、環境変数(設定されている場合)を使用します。あなたが観察した違いは、一部のプログラムがPATH
環境変数そうでない人もいます。
への依存はPATH
次のように機能します。実行する実行可能ファイルを「エンコード」する文字列があります。たとえば、文字列は/bin/bash
、 、foo/bash
またはですbash
。次の 2 つのケースがあります。
- 文字列に が含まれている場合
/
、文字列自体は実行可能ファイルへの絶対パス (例/bin/bash
) または相対パス (例) として解釈されます。foo/bash
/
文字列に(例)が含まれていない場合bash
、実行可能ファイルのベース名のみを指定します。パスの残りの部分 (つまり、ディレクトリ コンポーネント) は から取得されますPATH
。基本的に、指定されたベース名の実行可能ファイルを含む、 で指定された最初のディレクトリです。 に応じて、PATH
は、、( )として解決できます。PATH
bash
/bin/bash
/home/you/bin/bash
./bash
めったに) またはまったく表示されません (command not found
または同様のエラーが表示されます)。
シェルは に依存しているPATH
ため、シェルでは(文字どおりに入力するか、または のbash
展開から出現)または が適切に構成されたシステムで見つかります。$SHELL
/bin/bash
/some/other/path/to/bash
に依存しないツールは、PATH
文字列をパス (パス名) として扱います。 を含む文字列の場合は、これは何の違いもありません/
。 を含まない文字列の場合は、大きな違いがあります/
。 文字列が でbash
、パスとして直接解釈される場合、それは と同等であり、 「現在の作業ディレクトリで という./bash
名前のファイル」を意味します。bash
エラーの原因となったものは、どうやら変数の内容を取得しSHELL
、変数に依存せずにそれをパスとして使用したようですPATH
。
これは正しいやり方でした。POSIX指定するSHELL
として:
この変数は、ユーザーが好むコマンド言語インタープリタのパス名を表します。
調査する "パス名" そして "パス名の解決" の場合、これらは に依存しませんPATH
。変数を使用するツールは、SHELL
その内容を直接パス名として扱う必要があります。
のときSHELL="bash"
、シェルでは"$SHELL"
Bashのみが実行されます$SHELL
。他の変数と同様にそしてbash
治療されるを含まない他のコマンドと同様に/
。だから、それはちょっと偶然なんだよ。
POSIX ドキュメントを正しく解釈すると、SHELL="bash"
を意味する場合にのみを使用する必要がありますSHELL="./bash"
。 これを意味している場合でも、 を含むパスを使用する方が適切です。 を使用できる/
シェルのメカニズムが、の解釈PATH
方法に影響を与えないようにするためです。SHELL
おそらく、あなたは を望んでいないでしょう./bash
。あなたが望むの/bin/bash
はまさにこれです。