SHELL="/bin/bash" と SHELL="bash"

SHELL="/bin/bash" と SHELL="bash"

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/bashbash 一般的に

環境変数の目的SHELLは、使用したいシェルを指定することです。さまざまなソフトウェアが、何らかの理由で選択したシェルを実行するために、環境変数(設定されている場合)を使用します。あなたが観察した違いは、一部のプログラムがPATH環境変数そうでない人もいます。

への依存はPATH次のように機能します。実行する実行可能ファイルを「エンコード」する文字列があります。たとえば、文字列は/bin/bash、 、foo/bashまたはですbash。次の 2 つのケースがあります。

  1. 文字列に が含まれている場合/、文字列自体は実行可能ファイルへの絶対パス (例/bin/bash) または相対パス (例) として解釈されます。foo/bash
  2. /文字列に(例)が含まれていない場合bash、実行可能ファイルのベース名のみを指定します。パスの残りの部分 (つまり、ディレクトリ コンポーネント) は から取得されますPATH。基本的に、指定されたベース名の実行可能ファイルを含む、 で指定された最初のディレクトリです。 に応じて、PATHは、、( )として解決できます。PATHbash/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はまさにこれです。

関連情報