`< .`とこの `echo`動作に特別なものはありますか?

`< .`とこの `echo`動作に特別なものはありますか?

< .bashには特別なものがあるのだろうか。

$ mail <destination> < .

ドットの代わりに空のメールを送る

$ echo < .

私がエコについて知っているどんなものにも合いません。

echoいくつかの修正後、次の動作をどのように説明するかを知りたいです。

$ echo <=>構文エラー

$ echo < giberish=>エラー:そのファイルまたはディレクトリがありません。

$ echo < . giberish=>giberish

$ echo < .=>スペース

$ echo < "filenameInPWD"=>スペース

$ echo < "randomstring"=>エラー:そのファイルまたはディレクトリがありません。

答え1

そうすれば

strace mail <dest> < .

何が起こっているのかを知ることができます(注意深く見てください)。 Linuxシステム(コメントに記載されているようにディレクトリの読み取りが成功した場合、他のUnixシステムは異なる動作をする可能性があります)には約200行の出力があり、ほとんどは初期化ですが、非常に重要な3行があります。ケースには153、165、191の3行があります。

...
read(0, 0x556829edb730, 8192)           = -1 EISDIR (Is a directory)
...
write(1, "No message, no subject; hope tha"..., 39No message, no subject; hope that's ok) = 39
...
write(4, "Date: Sat, 10 Oct 2020 23:19:22 "..., 212) = 212
...
exit_group(0)                           = ?
+++ exited with 0 +++

IOW、ファイル記述子0(標準入力)を読み取ろうとするとエラーが発生しますEISDIR。これは、シェルが.標準入力にリダイレクト(つまり現在のディレクトリ)してreadディレクトリを読み取ることができないためです。ただし、メールプログラムはエラーを無視し、標準出力(ファイル記述子1)に送信されたメッセージやトピックがないことを示すメッセージを書き、大丈夫です。次に、引き続きメールメッセージを作成して書き込みます。 4、おそらく何らかの方法でメッセージを送信するようです(メッセージは212文字で構成されています)。また、プログラムは状態0(正常終了)で終了します。

catまたはで同じ操作を実行しようとすると、trわずかに異なる結果が表示されます。このプログラムはまだファイル記述子0から読み取ろうとし、EISDIRエラーを受け取ります。いいえエラーは無視されます。代わりに、エラーメッセージとゼロ以外の状態で終了します。

$ strace cat < .
...
read(0, 0x7fc27daec000, 131072)         = -1 EISDIR (Is a directory)
write(2, "cat: ", 5cat: )                    = 5
write(2, "-", 1-)                        = 1
openat(AT_FDCWD, "/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, ": Is a directory", 16: Is a directory)        = 16
write(2, "\n", 1
)                       = 1
munmap(0x7fc27daeb000, 139264)          = 0
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++

ただし、処理に違いはありません< .。どちらの場合も、シェルはファイル(現在のディレクトリ)をランチャーのファイル記述子0(標準入力)に関連付けます。ただし、プログラムはさまざまな方法でエラーに応答するように選択します。それはすべてです。

mailところで、@thanasispの答えは正確でほとんどの質問に対する答えです(コマンドと例えばこの答えで焦点を当てているorとのtr微妙な違いを無視しても)。cat

答え2

find .ドットは現在のディレクトリを表し、などの一般的な一般的なコマンドで見ることができます。cp path/filename .「ここ」を意味します。また、ドットはをsource入力して表示できるコマンドの同義語ですman .

あなたの場合、ドットは次の構文のために現在のディレクトリとして使用されます。

command < path/to/something

のようにコマンドの標準入力にリダイレクトされます。バッシュマニュアル、そして次の構文は:

command < path/to/something argument

上記と同じで、以下のようにパラメータがもう1つあります。

command argument < path/to/something

したがって、あなたの場合は、echo標準入力をまったく読みません。

tr標準入力を読むなどの他のコマンドを使用すると、これをよりよく見ることができます。

tr < . 'a' 'b' # or tr 'a' 'b' < .
tr: read error: Is a directory
tr < file 'a' 'b' # works.

関連情報