[unix] 이하의 부호가 왜 bash의 고양이를 대체하지 못합니까?

나는 “고용이없는 고양이”에 대해 들었고 몇 가지 제안을 찾았지만 다음은 내 bash 쉘에서 아무것도 출력하지 않습니다.

< filename

고양이를 사용하면 예상대로 작동합니다.

cat filename

Fedora Core 18 및 GNU bash, 버전 4.2.45 (1)을 사용하고 있습니다.

편집 : 파이프 앞에서 사용하면 작동하지 않습니다.

< filename | grep pattern

고양이를 사용하면 예상대로 작동합니다.

cat filename | grep pattern

EDIT2 : 명확히하기 위해 이것을 사용할 수 있음을 알고 있습니다

grep pattern < filename

그러나 나는 /programming/11710552/useless-use-of-cat 에서 명령 앞에서 사용할 수도 있습니다. 그러나 명령 앞에서는 작동하지 않습니다.



답변

보다 작음 및 기호 ( <)는 파일을 열고 일부 응용 프로그램 / 프로그램의 표준 입력 장치 핸들에 첨부합니다. 그러나 입력에 연결할 응용 프로그램을 쉘에 제공하지 않았습니다.

이 두 예제는 본질적으로 동일한 작업을 수행하지만 약간 다른 방식으로 입력을 얻습니다.

파일을 엽니 다

$ cat blah.txt
hi

STDIN을 엽니 다

$ cat < blah.txt
hi

커튼 뒤에 엿보기

strace무슨 일이 일어나고 있는지 볼 수 있습니다 .

파일에서 읽을 때

open("blah.txt", O_RDONLY)              = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=3, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(3, "", 65536)                      = 0
close(3)                                = 0
close(1)                                = 0

STDIN에서 읽을 때 (0으로 식별)

read(0, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(0, "", 65536)                      = 0
close(0)                                = 0
close(1)                                = 0

첫 번째 예 cat에서 파일 을 열어서 읽은 것을 볼 수 있습니다 blah.txt. 두 번째 로 설명자 번호 0으로 식별 된 STDIN 파일 설명자를 통해 cat파일 내용 을 읽는다는 것을 알 수 있습니다 blah.txt.

read(0, "hi\n", 65536)                  = 3


답변

일반적으로 쓸모없는 사용은 cat파일을 직접 열 수있는 프로그램에 입력 할 때 사용하는 것입니다. 예를 들면 다음과 같습니다.

나쁜

cat file | grep foo
cat file | while read line; do echo "$line"; done
cat file | sed 's/a/b/'
cat file | awk '{print $1}'

좋은

grep foo file
while read line; do echo "$line"; done < file
sed 's/a/b/' file
awk '{print $1}' file

또한 좋습니다 ( <file명령의 양쪽에있을 수 있음)

<file grep foo
 sed 's/a/b/' < file
<file awk '{print $1}' 


답변

UUOC는 다음에 있습니다.

cat somefile | some-cmd

또는

cat < somefile | some-cmd

거기에서 자신이 읽는 파이프에서 some-cmd내용을 읽습니다 .somefilecatsomefile

some-cmdsomefile쉘이 stdin에서 쉘을 연 후 직접 읽을 수 있으므로 필요하지 않습니다 cat.

some-cmd < somefile

또는

< somefile some-cmd

(리디렉션은 간단한 명령 줄의 어느 곳에 나 나타날 수 있습니다).


답변