`< .`와 이 `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 오류를 수신합니다.아니요오류는 무시됩니다. 대신 오류 메시지와 0이 아닌 상태로 종료됩니다.

$ 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

위와 동일하며 아래와 같이 매개변수가 하나 더 있습니다.

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.

관련 정보