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


17

나는 "고용이없는 고양이"에 대해 들었고 몇 가지 제안을 찾았지만 다음은 내 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 에서 명령 앞에서 사용할 수도 있습니다. 그러나 명령 앞에서는 작동하지 않습니다.


2
효과가있다. 당신이 시도한 것은 Jonathan Leffler의 의견 과 동일하지 않습니다 .
manatwork

"고양이의 목적은 파일을 연결 (또는"catenate ")하는 것입니다. 파일이 하나 뿐인 경우 파일을 전혀 연결하지 않으면 시간이 낭비되고 프로세스 비용이 발생합니다." partmaps.org/era/unix/award.html
Bonsi Scott

답변:


22

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

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

파일을 엽니 다

$ 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

1
그래서 쓸모없는 고양이 사용에 대한 이야기는 가짜입니까?
버그

@ 버그-아니요, 용도가 있습니다. 그러나 cat일반적으로 오해되고 필요하지 않을 때 사용됩니다.
slm

그러나 작업 순서를 왼쪽에서 오른쪽으로 유지하려면 필요합니까? 명령 앞에 작지 않은 구문을 사용할 수도 있다는 것을 읽었습니다.
버그

@bug yes 명령 전후에 리디렉션이 발생할 수 있습니다 (Stephane의 답변 참조).
slm

아, 이제 알겠다 나는 써야 할 것이다 < filename command.
버그

14

일반적으로 쓸모없는 사용은 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}' 

6
여기서 "나쁜"은 주관적입니다. 이 때문에 나는 더 나은 전반적인해야 할 사람들을 찾을 방법 보다 일관되고 쉽게 읽을. 더 많은 파이프가 관련된 경우와 마찬가지로 데이터 흐름은 왼쪽에서 오른쪽으로 이루어집니다.
Izkata

2
@Izkata는 쓸모없는 사용이라는 의미에서 "나쁜"것입니다 cat.
terdon

"내려가는! 테이블에서 내려요! 당신은 나쁜 고양이입니다! ”;-)하지만 진지하게…
G-Man은 'Reinstate Monica'라고 말합니다

1
좋은 주목할만한 (또는, 적어도, 유용한)의 용도는 cat(1)를 포함 cat file(화면에 출력 / 단자, 파일이 화면이 높은보다 긴 경우, 당신이 사용하는 것을 선호 수도 있지만 moreless이나 뭐 그런) (2) cat file1 file2 file3 > all_data( 정확히 무엇을 cat위한 것입니다), (3) cat f1 f2 f3 | tr …(또는 직접의 파일을 통과하고 싶지 않은 다른 모든 프로그램에 파이프, 예를 들어, wc(예를 들어, 당신이 총계를보고 싶은 경우에만) 또는 grep(예를 들어, 당신은 지원하지 않는 이전 버전이있는 경우 -h, 즉, --no-filename)는), (계속)
G-남자가 말한다 '분석 재개 모니카'

(계속)… (4) cat -n file | sort … -k1 | sed 's/^ *[0-9]*\t//', (5) sudo cat file600 | untrusted_program(즉, 사용자 (UID)가 파일을 읽을 수 없으며 프로그램을 루트 또는 반 특권 UID로 실행하고 싶지 않음) 또한 ( E ) (즉, 2와 3 사이의 숫자) program_that_generates_html | cat static_html_header - static_html_footer(당신이 것이 아마 파일이나 파이프로 리디렉션 할).
G-Man, 'Reinstate Monica'라고

13

UUOC는 다음에 있습니다.

cat somefile | some-cmd

또는

cat < somefile | some-cmd

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

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

some-cmd < somefile

또는

< somefile some-cmd

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.