4

終わり近くのRHEL6/etc / profileには、ifステートメントがあります。

if [ "${-#*i}" != "$-" ];

!=私が推測しているのは、文字列比較演算子の「等しくない」ということです。私が推測している左側は変数内の文字列で-@*iあり、右側は変数内の文字列です$-(これはスクリプトに渡されるフラグだと思います)。これはforループの途中であり、$ iが存在するはずですが、何が起こるかわかりません-#*i

$-スクリプトに渡されるフラグが正しいと仮定すると、${-#*i}フラグでもある必要があると思いますが、実際には手がかりがありません。

誰か説明してもらえますか?これらの特別な変数のリストへのリンクもいただければ幸いです。

前もって感謝します。

4

3 に答える 3

4

bashのマンページで「${parameter#word}」を探してください。左の式の#は、$-の内容の「最初から「i」まで」であるパターン「*i」を削除します。$-には、現在のシェルのフラグが含まれます(を参照set)。

kjpは、シェルがインタラクティブモードで実行されているかどうかのチェックであるということは正しいです(比較のために文字列から可能な「i」フラグを削除することによって)。Bashのマンページには次のように書かれています。

対話型シェルは、オプション以外の引数なしで開始され、標準の入力とエラーの両方が端末に接続されている-cオプションなしで開始されたシェル(isatty(3)で決定)、または-iオプションで開始されたシェルです。PS1が設定され、bashがインタラクティブである場合は$-にiが含まれ、シェルスクリプトまたはスタートアップファイルがこの状態をテストできるようになります。

于 2012-07-18T15:56:33.447 に答える
4

現在のシェルがインタラクティブシェルであるかどうかをチェックしています。

変数(シェルに渡されるフラグのリストを含む)に存在-iすることは、対話型シェルと非対話型シェルをチェックする1つの方法です。以下を含む内部シェル変数のリストについては、ここを参照してください$-$-

于 2012-07-18T16:02:05.517 に答える
2

$-変数が何であるかはわかりませんが、上記のコードは基本的に。$-が含まれているかどうかをテストしていiます。

in bash${var#pattern}$var、最小の一致patternが削除されていることを意味します。pattern見つからない場合は、$var変更されずに返されます。

したがって、あなたの例では、$-だった場合fish。次に${-#*i}なりますsh。したがって、ifステートメントはtrueになります(sh!=のためfish)。

あなたのためのリンク:

bashでの変数の拡張:http ://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

Bashで定義された変数:http ://www.gnu.org/software/bash/manual/bashref.html#Shell-Variables

于 2012-07-18T15:57:18.893 に答える