Bashで `SHELL=/bin/sh lesspipe"` 構文が正しいのはなぜですか? [複製]

Bashで `SHELL=/bin/sh lesspipe

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の変数の割り当て()はまだ適用されません。結果は以前の値に置き換えられます。設定されていない場合は空の文字列に置き換えられます$abcabcこれにより、空の文字列は引用されていないため、完全に削除されます。
  • コマンドの置換: 該当なし
  • 算術拡張:該当なし
  • トークン化:唯一の候補は$abc変数拡張の結果ですが、空の文字列には分割する内容はありません。
  • パス名拡張:該当なし

拡張が完了したら、abc実行するユーティリティ環境の変数を「hello」値に設定し、echoコマンドを実行します。ただ空行だけを出力します。


厳密に言えば、ls引数としても渡されますargv[0]lsその引数を使用して呼び出し方法を理解し、出力されるエラーメッセージにも使用しますが、操作を実行するためのオプションやファイルとしては使用しません。

²シンボリックリンクであるが宛先を確認できない場合、一部の実装はlsファイルが存在しないかのようにエラーメッセージを出力します。

おすすめ記事