![Bashで `SHELL=/bin/sh lesspipe"` 構文が正しいのはなぜですか? [複製]](https://linux33.com/image/138550/Bash%E3%81%A7%20%60SHELL%3D%2Fbin%2Fsh%20lesspipe%22%60%20%E6%A7%8B%E6%96%87%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F%20%5B%E8%A4%87%E8%A3%BD%5D.png)
UbuntuなどのLinuxでは、デフォルト.bashrc
ファイルには次の1行が含まれています。
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
それでは、なぜSHELL=/bin/sh lesspipe
文法的に正しいのですか?man bash
この文の意味はどのページで確認できますか?私にとって、このステートメントは例えば次のように密接に関連しているようです。
ls echo
、これは無効です。返品、
abc=hello echo $abc
エラーはありませんが、NULL出力です。
man bash
いくつかの検索コマンドを試しましたが、/<expression>
関連情報が見つかりませんでしたless
。誰でもこのコマンドの説明を教えてもらえますか?
注:「という投稿を読みました。基本的な.bashrcの評価式を説明できますか?「しかし、得たものは何もありませんでした。
答え1
スチールドライバーが言ったように、SHELL=/bin/sh lesspipe
はい簡単なコマンド、これは次の順序で定義されます。
- オプションの変数割り当て(ここでは
SHELL=/bin/sh
)、続いて... - スペース- 区切られた単語とリダイレクト(ここ
lesspipe
)、次に終わる - ㅏ制御演算子、改行文字を含む。
最初の例:
ls echo
実際に有効なコマンドです。最初の単語だけを実行するコマンドと見なされ、残りはコマンドの引数として提供されます。
コマンドの場合、ls
現在のディレクトリに指定されているサブディレクトリがある場合は、その内容が一覧表示されます。echo
ディレクトリでない場合は、echo
その名前²が表示されます。どちらも真でない場合、コマンドはエラーを返し、No such file or directory
エラーメッセージを表示します。
2番目の例:
abc=hello echo $abc
また、変数割り当てを含む単純なコマンドですが、変数拡張($abc
)も含まれます。これ拡張各章では、man bash
さまざまな拡張機能と操作順序を定義します。
コマンドラインが単語に分割された後、シェルは拡張を確認します。
- キャリブレータ拡張:該当なし
- チルダ拡張:該当なし
- パラメータと変数の拡張:
$abc
ここを名前付きシェルまたは環境変数の現在の値に置き換えますabc
。ただし、コマンドラインがまだ実行されていないため、その行の前abc=hello
の変数の割り当て()はまだ適用されません。結果は以前の値に置き換えられます。設定されていない場合は空の文字列に置き換えられます$abc
。abc
これにより、空の文字列は引用されていないため、完全に削除されます。 - コマンドの置換: 該当なし
- 算術拡張:該当なし
- トークン化:唯一の候補は
$abc
変数拡張の結果ですが、空の文字列には分割する内容はありません。 - パス名拡張:該当なし
拡張が完了したら、abc
実行するユーティリティ環境の変数を「hello」値に設定し、echo
コマンドを実行します。ただ空行だけを出力します。
厳密に言えば、ls
引数としても渡されますargv[0]
。ls
その引数を使用して呼び出し方法を理解し、出力されるエラーメッセージにも使用しますが、操作を実行するためのオプションやファイルとしては使用しません。
²シンボリックリンクであるが宛先を確認できない場合、一部の実装はls
ファイルが存在しないかのようにエラーメッセージを出力します。