나는 “고용이없는 고양이”에 대해 들었고 몇 가지 제안을 찾았지만 다음은 내 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
내용을 읽습니다 .somefile
cat
somefile
some-cmd
somefile
쉘이 stdin에서 쉘을 연 후 직접 읽을 수 있으므로 필요하지 않습니다 cat
.
some-cmd < somefile
또는
< somefile some-cmd
(리디렉션은 간단한 명령 줄의 어느 곳에 나 나타날 수 있습니다).