コマンド(つまりgrep)は、glob拡張の一部として実行されたことをどのように知るのですか?

codecitrus

私の理解によると、globワイルドカードはシェルによって解釈され、シェルは一致するファイル名ごとに指定されたコマンドを実行します。abc1, abc2, and abc3現在のディレクトリにファイルがあるとします次に、たとえば、echo abc*「abc」で始まるファイル名ごとに1回エコーします。

ただし、実行するgrep 'foo' abc*、次のように実行されるはずです。

grep 'foo' abc1
grep 'foo' abc2
grep 'foo' abc3

つまり、次の出力を取得する必要があります(すべてのファイルに「foo」という1行が含まれていると仮定します)。

foo
foo
foo

ただし、代わりに次のようになります。

abc1:foo
abc2:foo
abc3:foo

したがって、これには2つの考えられる説明があると思います。まず、どういうわけか、grepはglob式で使用されたことを検出し、一致する前にファイル名を出力することで応答します。次に、複数のファイルをgrepに渡すことができるため、シェルは実際には1つのコマンドのみを実行します。

grep 'foo' abc1 abc2 abc3

ただし、これは、grepが最後に複数のファイルを受け入れるためにのみ機能します。別のコマンドでは1つのファイルしか渡されない可能性があります。したがって、globに一致する複数のファイルに対してコマンドを実行する場合、上記の2番目の方法でglobが機能すると機能しません。

とにかく、誰かがこれにいくつかの光を当てることができますか?

ありがとう!

Sergiy Kolodyazhnyy

それがトリックです:コマンドは知りません、それは仕事をするシェルです

たとえば、を考えてみましょうgrep 'abc' *.txtシステムコールのトレースを実行すると、次のようなものが表示されます。

bash-4.3$ strace -e trace=execve grep "abc" *.txt > /dev/null
execve("/bin/grep", ["grep", "abc", "ADDA_converters.txt", "after.txt", "altera_license.txt", "altera.txt", "ANALOG_DIGITAL_NOTES.txt", "androiddev.txt", "answer2.txt", "answer.txt", "ANSWER.txt", "ascii.txt", "askubuntu-profile.txt", "AskUbuntu_Translators.txt", "a.txt", "bash_result.txt", ...], [/* 80 vars */]) = 0
+++ exited with 0 +++

シェルは*.txt.txt拡張子で終わる現在のディレクトリ内のすべてのファイル名に展開されましたしたがって、効果的に、シェルはgrep 'abc' *.txtコマンドをに変換grep 'abc' file1.txt file2.txt file3.txt . . .ます。したがって、2番目の仮定は正しいです。

最初の仮定は正しくありません-プログラムにはグロブを検出する方法がありません。*文字列引数としてコマンドに渡すことは可能ですが、それをどうするかを決めるのはコマンドの仕事です。ただし、ファイル名の展開は、すでに述べたように、それぞれのシェルのプロパティです。

ただし、これは、grepが最後に複数のファイルを受け入れるためにのみ機能します。別のコマンドでは、1つのファイルしか渡されない可能性があります。

まさにその通り!プログラムは、受け入れ可能なコマンドライン引数の数を制限しませんが(たとえば、文字列の配列であるCconst char *args[]やPythonの場合sys.argv[])、その配列長さや、予期しない何かが間違った配列位置にあるかどうかを検出できますgrepこれは行わず、複数のファイルを受け入れます。これは仕様によるものです。


ちなみに、不適切な引用とgrepを使用したグロビングが問題になる場合があります。このことを考慮:

bash-4.3$ echo "one two" | strace -e trace=execve grep *est*
execve("/bin/grep", ["grep", "self_test.sh", "test.wxg"], [/* 80 vars */]) = 0
+++ exited with 1 +++

準備ができていないユーザーは、grepがestパイプからの文字を含むすべての行に一致することを期待しますが、代わりにシェルのファイル名拡張がひねりを加えます。私はこれがそうする人々でたくさん起こるのを見ましたps aux | grep shell_script_name.sh、そして彼らは彼らのプロセスが実行されているのを見つけることを期待しています、しかし彼らはスクリプトがあった同じディレクトリからコマンドを実行したので、シェルのファイル名拡張はgrepコマンドをユーザーが期待したものとは完全に異なって見えるようにしました。

適切な方法は、一重引用符を使用することです。

bash-4.3$ echo "one two" | strace -e trace=execve grep '*est*'
execve("/bin/grep", ["grep", "*est*"], [/* 80 vars */]) = 0
+++ exited with 1 +++

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

フレームワークがメインアプリまたは拡張機能の一部として実行されているかどうかを検出することは可能ですか?

分類Dev

実行コマンド(つまりF5)の一部としてバッチファイルを実行することは可能ですか?

分類Dev

一部のターミナルコマンドをファイルとして保存して実行するにはどうすればよいですか?

分類Dev

どのように私はマップとの一致を使用してコードの私の一部を行うことができますか?

分類Dev

onlyifの一部として別のコマンドを実行するようにPuppetexecをどのように構成しますか

分類Dev

アクティブなdisplay / vtが実行されている場所と異なる場合、一部のコマンドが失敗します。それを修正/回避するにはどうすればよいですか?

分類Dev

コマンドの一部を入力したときに表示される提案を変更するにはどうすればよいですか?

分類Dev

一部のコマンドはPHPexec()で実行されますが、他のコマンドは実行されません。これを回避/修正するにはどうすればよいですか?

分類Dev

文字列の一部をコマンドとして呼び出さないようにするにはどうすればよいですか?

分類Dev

bash配列の一部がコマンドとして実行されるのはなぜですか?

分類Dev

一部のアプリケーションコードが実行されたときに、書き込まれるすべてのテーブルを特定するにはどうすればよいですか?

分類Dev

アプリケーションは、Google AppEngineで実行されていることをどのようにして知ることができますか?

分類Dev

setup.pyの一部としてSphinxdoctestを実行するにはどうすればよいですか?

分類Dev

Windowsコマンドライン:パスの一部として変数を使用してコマンドを実行することはできません

分類Dev

これをMongoShellで1つのコマンドとして実行するにはどうすればよいですか?

分類Dev

この「wget」コマンドと同様に実行される同等の「curl」コマンドを実行するにはどうすればよいですか?

分類Dev

このコードを取得して、リストの一部として従業員の給与に追加するにはどうすればよいですか?

分類Dev

`w`コマンドはどのようにしてアイドル時間と実行中のコマンドを知るのですか?

分類Dev

コマンドが実行されていることを検出し、現在のコマンドの後に追加のコマンドを実行するにはどうすればよいですか?

分類Dev

ドキュメント内のキーワードのセットをどのように見つけることができますか?それらのすべて/一部は特定の距離のカットオフにありますか?

分類Dev

コマンドによって生成された出力の一部のみをリダイレクトするにはどうすればよいですか?

分類Dev

「grep | grep」コマンドをbash関数の文字列として実行するにはどうすればよいですか?

分類Dev

サーバー側で実行されるシェルコマンドの一部としてユーザーから渡されたパラメーターを使用することは危険ですか?

分類Dev

AWSで実行されているアプリケーションはどのようにして環境を知ることができますか?

分類Dev

コマンドを切り替えることで、一部のグラフのみが表示されるように、または表示されないように、Rmarkdownでグローバルオプションチャンク関数を指定する方法はありますか?

分類Dev

一部のコードがBazelでコンパイルされないことを確認するにはどうすればよいですか?

分類Dev

どのように私は、Javaコード内で、私のchromedriverを使用してJSのコマンドを実行することができますか?

分類Dev

Goで実行しているときに実行されているコマンドの出力をどのように取得しますか?

分類Dev

findコマンドを使用して複数の拡張機能のバッチジョブを実行するにはどうすればよいですか?

Related 関連記事

  1. 1

    フレームワークがメインアプリまたは拡張機能の一部として実行されているかどうかを検出することは可能ですか?

  2. 2

    実行コマンド(つまりF5)の一部としてバッチファイルを実行することは可能ですか?

  3. 3

    一部のターミナルコマンドをファイルとして保存して実行するにはどうすればよいですか?

  4. 4

    どのように私はマップとの一致を使用してコードの私の一部を行うことができますか?

  5. 5

    onlyifの一部として別のコマンドを実行するようにPuppetexecをどのように構成しますか

  6. 6

    アクティブなdisplay / vtが実行されている場所と異なる場合、一部のコマンドが失敗します。それを修正/回避するにはどうすればよいですか?

  7. 7

    コマンドの一部を入力したときに表示される提案を変更するにはどうすればよいですか?

  8. 8

    一部のコマンドはPHPexec()で実行されますが、他のコマンドは実行されません。これを回避/修正するにはどうすればよいですか?

  9. 9

    文字列の一部をコマンドとして呼び出さないようにするにはどうすればよいですか?

  10. 10

    bash配列の一部がコマンドとして実行されるのはなぜですか?

  11. 11

    一部のアプリケーションコードが実行されたときに、書き込まれるすべてのテーブルを特定するにはどうすればよいですか?

  12. 12

    アプリケーションは、Google AppEngineで実行されていることをどのようにして知ることができますか?

  13. 13

    setup.pyの一部としてSphinxdoctestを実行するにはどうすればよいですか?

  14. 14

    Windowsコマンドライン:パスの一部として変数を使用してコマンドを実行することはできません

  15. 15

    これをMongoShellで1つのコマンドとして実行するにはどうすればよいですか?

  16. 16

    この「wget」コマンドと同様に実行される同等の「curl」コマンドを実行するにはどうすればよいですか?

  17. 17

    このコードを取得して、リストの一部として従業員の給与に追加するにはどうすればよいですか?

  18. 18

    `w`コマンドはどのようにしてアイドル時間と実行中のコマンドを知るのですか?

  19. 19

    コマンドが実行されていることを検出し、現在のコマンドの後に追加のコマンドを実行するにはどうすればよいですか?

  20. 20

    ドキュメント内のキーワードのセットをどのように見つけることができますか?それらのすべて/一部は特定の距離のカットオフにありますか?

  21. 21

    コマンドによって生成された出力の一部のみをリダイレクトするにはどうすればよいですか?

  22. 22

    「grep | grep」コマンドをbash関数の文字列として実行するにはどうすればよいですか?

  23. 23

    サーバー側で実行されるシェルコマンドの一部としてユーザーから渡されたパラメーターを使用することは危険ですか?

  24. 24

    AWSで実行されているアプリケーションはどのようにして環境を知ることができますか?

  25. 25

    コマンドを切り替えることで、一部のグラフのみが表示されるように、または表示されないように、Rmarkdownでグローバルオプションチャンク関数を指定する方法はありますか?

  26. 26

    一部のコードがBazelでコンパイルされないことを確認するにはどうすればよいですか?

  27. 27

    どのように私は、Javaコード内で、私のchromedriverを使用してJSのコマンドを実行することができますか?

  28. 28

    Goで実行しているときに実行されているコマンドの出力をどのように取得しますか?

  29. 29

    findコマンドを使用して複数の拡張機能のバッチジョブを実行するにはどうすればよいですか?

ホットタグ

アーカイブ