このシェル構文の仕組み:$ {1:-$(</ dev / stdin)}

ジョー・ヒーリー

私は最近bash、STDINからの引数またはストリームを受け入れることができる(つまり、パイプで接続できる)関数を作成するというコンテキストで、この非常に優れた構文に出くわしました表面的には、ここで何が起こっているのかは理解できますが、これがどのように機能するかについての実際のメカニズムについてもう少し説明したいと思います。

構文は次のとおりです(タイトルごと): ${1:-$(</dev/stdin)}

そして、文脈において、それを次のように使用するかもしれません:

log(){
 echo -e >&1 "INFO: ${1:-$(</dev/stdin)}"
}

次の使用を許可します。

$ log foo
INFO: foo

または、これを行うこともできます

mv -v foo.ext bar.ext | log
INFO: renamed 'foo.ext' -> 'bar.ext'

これは、引数とパイプの両方の機能をbash関数で有効にするために私が見た中で最も簡潔な方法であるため、素晴らしいです(残念ながら、今どこで遭遇したかを忘れています)。

今、私はここで起こっていることのほとんどを少なくとも表面的には理解しています(または理解していると思います)が、より深い理解をいただければ幸いです。これが私がそれをどのように解釈するかであり、その後に私の残りの質問が続きます:

${1:-$(</dev/stdin)}

  • ${1} 明らかに、関数が受け入れるデフォルトの引数です
  • ${1:-x}空の場合(または設定されていない'x'場合)、変数/中括弧の展開は文字列に「フォールバック」し$1ます。この場合、STDINプロセスサブにフォールバックします。
  • $()明らかにプロセスコマンド置換です
  • そして最後に、</dev/stdin明らかに標準入力からのリダイレクトであり、パイプがまったく機能することを可能にします。

これは基本的に$1、引数が入力されていない場合は、STDINの使用にフォールバックすることを意味します。これは概念的には満足しています。

だからここに私の質問があります:

  1. プロセスコマンド置換<内でリダイレクト()を見たことがありませんが、その前に実際のコマンドがあります(例$(cat < somefile.ext))。では、プロセスコマンド置換が他のコマンドを呼び出さずにリダイレクトを受信すると、実際に何が起こっているのでしょうか(要点)
  2. STDINリダイレクトをプロセスコマンド置換でラップする必要があるのはなぜですか?(実際、私がこれを書いているとき、私はそれなしでそれをテストしていませんが、私はそれを単純に保ちます)。
  3. これは安全ですか?マルチラインSTDINで使用しましたが、今のところ壊れていません。これはどこに落ちる可能性がありますか(どこかにある場合)。
Nahuel Fouilleul
  1. $(.. ):bashのマニュアルからコマンド置換ではないプロセスsubstiutionです<(... )およびコマンド置換から

コマンド置換$(cat file)は、同等であるがより高速な$(<file)に置き換えることができます。

  1. /dev/stdinシンボリックリンクである/proc/self/fd/0ための便利ここで、$(<..)ファイルを予期する構文。

  2. stdinが閉じるまでコマンドがブロックされる可能性があるため、これにより問題が発生する可能性があります。auは二重引用符で囲まれているため、複数行の入力が保持されるという意味で安全です。

最後に、パイプを作成し、mv -v foo.ext bar.ext | logログコマンドごとにプロセスをフォークする(のように)のは非効率的かもしれません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

POSIXシェルのstdinから1文字を読み取ることはできますか?

分類Dev

'' cat "$ {1:-/ dev / stdin} | ...&> / dev / null ''がbashで機能するのに、ダッシュでは機能しないのはなぜですか?

分類Dev

/ dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

分類Dev

/ dev / ttyとstdin / stdout / stderrの関係は何ですか?

分類Dev

/ dev / stdinを含む古いファイル記述子

分類Dev

/ dev / stdinファイルからtarを作成します

分類Dev

2>&-、2> / dev / null、|&、&> / dev / nullと> / dev / null 2>&1の違い

分類Dev

> / dev / null 2>&1&と</ dev / null&> / dev / null&の違い

分類Dev

-F / dev / stdin構文を使用すると、sshがすぐに切断されるのはなぜですか?

分類Dev

1つのstdinへの複数のstdout

分類Dev

/ dev / sdX1ではなく/ dev / sdXへの書き込み

分類Dev

Linuxの迷惑:/ dev / stdinはソケットでは機能しません

分類Dev

エコーまたは印刷/ dev / stdin / dev / stdout / dev / stderr

分類Dev

ddを使用した/ dev / stdinを使用した「不正なファイル記述子」

分類Dev

ddを使用した/ dev / stdinを使用した「不正なファイル記述子」

分類Dev

chmod 000 / dev / stdinはターミナルを永久に無効にしますか?

分類Dev

pythonパイプのみstdin、1回、2回以上の実行方法

分類Dev

stdinから-1文字を読み取る方法は?

分類Dev

/ dev / stdinという名前のファイルを繰り返し作成するのは危険ですか?

分類Dev

シェル標準ストリームのリダイレクト順序または2>&1 1> / dev / null vs 1> / dev / null 2>&1

分類Dev

/ dev / sda1と/ dev / xvda1の違いは何ですか?

分類Dev

stdinが/ dev / nullから取得され、stdoutとstderrの両方が/ dev / nullに移動するためのbashショートカット

分類Dev

Can the contents of /dev/disk0 (/dev/sda, etc) be used as stdin?

分類Dev

ClojureのSTDINから1文字を読み取るにはどうすればよいですか?

分類Dev

cronjobの「stdin:is not a tty」

分類Dev

STDINを1行ずつ読み取る最も速い方法は?

分類Dev

ノードでstdinから1行ずつ読み取る方法

分類Dev

PHPでSTDINを1行ずつ読み取る

分類Dev

"> / dev / null 2>&1"と "2> / dev / null>&2"の違いは何ですか

Related 関連記事

  1. 1

    POSIXシェルのstdinから1文字を読み取ることはできますか?

  2. 2

    '' cat "$ {1:-/ dev / stdin} | ...&> / dev / null ''がbashで機能するのに、ダッシュでは機能しないのはなぜですか?

  3. 3

    / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

  4. 4

    / dev / ttyとstdin / stdout / stderrの関係は何ですか?

  5. 5

    / dev / stdinを含む古いファイル記述子

  6. 6

    / dev / stdinファイルからtarを作成します

  7. 7

    2>&-、2> / dev / null、|&、&> / dev / nullと> / dev / null 2>&1の違い

  8. 8

    > / dev / null 2>&1&と</ dev / null&> / dev / null&の違い

  9. 9

    -F / dev / stdin構文を使用すると、sshがすぐに切断されるのはなぜですか?

  10. 10

    1つのstdinへの複数のstdout

  11. 11

    / dev / sdX1ではなく/ dev / sdXへの書き込み

  12. 12

    Linuxの迷惑:/ dev / stdinはソケットでは機能しません

  13. 13

    エコーまたは印刷/ dev / stdin / dev / stdout / dev / stderr

  14. 14

    ddを使用した/ dev / stdinを使用した「不正なファイル記述子」

  15. 15

    ddを使用した/ dev / stdinを使用した「不正なファイル記述子」

  16. 16

    chmod 000 / dev / stdinはターミナルを永久に無効にしますか?

  17. 17

    pythonパイプのみstdin、1回、2回以上の実行方法

  18. 18

    stdinから-1文字を読み取る方法は?

  19. 19

    / dev / stdinという名前のファイルを繰り返し作成するのは危険ですか?

  20. 20

    シェル標準ストリームのリダイレクト順序または2>&1 1> / dev / null vs 1> / dev / null 2>&1

  21. 21

    / dev / sda1と/ dev / xvda1の違いは何ですか?

  22. 22

    stdinが/ dev / nullから取得され、stdoutとstderrの両方が/ dev / nullに移動するためのbashショートカット

  23. 23

    Can the contents of /dev/disk0 (/dev/sda, etc) be used as stdin?

  24. 24

    ClojureのSTDINから1文字を読み取るにはどうすればよいですか?

  25. 25

    cronjobの「stdin:is not a tty」

  26. 26

    STDINを1行ずつ読み取る最も速い方法は?

  27. 27

    ノードでstdinから1行ずつ読み取る方法

  28. 28

    PHPでSTDINを1行ずつ読み取る

  29. 29

    "> / dev / null 2>&1"と "2> / dev / null>&2"の違いは何ですか

ホットタグ

アーカイブ