가끔 다음과 같은 내용을 볼 수 있습니다.
cat file | wc | cat > file2
왜 이런 일을 하는가?
결과(또는 성능)가 다음의 간단한 경우와 언제 (유리하게) 달라질까요?
cat file | wc > file2
답변1
두 가지 예는 모두고양이에게 쓸모없는 용도. 둘 다 동일합니다 . 동적으로 출력을 생성하기 위한 임시 대체 수단 으로 사용하지 않는 한 이 예제에서는 사용할 wc < file1 > file2
이유가 없습니다 .cat
cat file
답변2
cat file | wc | cat > file2
cat
일반적 으로 다음과 기능적으로 동일하므로 두 가지 쓸모가 없습니다 .
< file wc > file2
그러나 다음과 같은 상황이 있을 수 있습니다.
cat file | wc -c
초과하다
< file wc -c
wc
이는 많은 구현이 일반 파일에 대해 수행하는 최적화를 비활성화하는 것입니다.
일반 파일의 경우 파일의 바이트 수를 얻기 위해 파일의 전체 내용을 읽을 필요는 없지만 stat()
시스템 호출을 수행하고 inode에 저장된 크기를 검색하기만 하면 됩니다.
이제 다음과 같은 이유로 이 파일을 읽고 싶을 수도 있습니다.
정보
stat()
를 신뢰할 수 없습니다(예: Linux의 특정 파일/proc
)/sys
:$ < /sys/class/net/lo/mtu wc -c 4096 $ cat /sys/class/net/lo/mtu | wc -c 6
- 사람들은 읽을 수 있는 데이터의 양을 확인하고 싶어합니다(예: 하드 드라이브 오류의 경우).
- 사람들은 단지 데이터 읽기 속도에 대한 벤치마크를 원합니다.
- 파일의 내용을 메모리에 캐시하고 싶습니다.
물론 이는 예외입니다. 일반적으로 < file wc -c
성능상의 이유로 이를 사용하는 것이 좋습니다 .
cat file | wc | cat > file2
이제 ::를 사용하고 싶은 좀 더 터무니없는 시나리오를 상상할 수 있습니다 .
- 허용 되는
wc
경우 파일을 읽거나 쓰지 못하게 하는 의류 프로필이나 기타 보안 메커니즘이 있을 수 있습니다.cat
- 큰 파일(예: 2 32 바이트 이상)
cat
을 처리할 수 있지만 이 시스템에서는 처리할 수 없습니다(과거 일부 시스템의 일부 명령에는 비슷한 것이 필요했습니다).wc
- 어쩌면 누군가 는 쓰기 위해 열 수 없더라도 전체 파일을 실행하고 읽기를 원할 수도 있습니다
wc
( 마지막 순간에 죽임을 당할 수도 있습니다).cat
file2
- 어쩌면 누군가가 콘텐츠를 열거나 읽는 실패(종료 상태)를 숨기고 싶어할 수도 있습니다
file
. 그러나 그것은 더 의미가 있을 것입니다wc < file > file2 || :
. - 어쩌면 누군가가 (List Open Files)의 출력에서 단어
lsof
수를 가져오거나 .file
file2
답변3
나는 "고양이를 쓸모없다"는 주장에 동의하지 않지만,할 수 있는이유는 다음과 같습니다.
영어를 포함한 많은 언어에서는 단어와 문장이 왼쪽에서 오른쪽으로 읽혀지므로 동일한 방식으로 데이터 흐름을 표시하는 것이 독자에게 더 자연스럽게 보일 것입니다.
두 번째 이유 cat
는 반환 코드를 가리기 위한 것일 수 있습니다. 예를 들어:
$ wc < /etc/passw
sh: /etc/passw: Cannot find or open the file.
$ echo $?
1
그리고 cat
:
$ wc < /etc/passw | cat
sh: /etc/passw: Cannot find or open the file.
$ echo $?
0
지각이 굳어지면 이것이 작용하게 됩니다 set -e
. 첫 번째 예에서는 shell이 중단되지만 wc
, 후자의 예에서는 계속 실행됩니다. 이 문제를 해결하는 다른 방법도 분명히 있습니다.
또한 두 명령문(즉, cat이 있거나 없는) 사이의 성능 차이는 무시할 수 있으며(특히 오늘날의 컴퓨터에서는) 중요하다면 쉘이 잘못된 언어입니다.
답변4
이 명령문에는 cat의 두 가지 용도가 포함되어 있습니다.
고양이서류 | 화장실 |고양이> 파일 2
분명히 두 번째 고양이는 가치가 없습니다.
고양이파일 | 화장실 > 파일 2
내가 사용한 모든 쉘에서 동일한 의미를 갖습니다.
하지만
<파일 wc> 파일 2
해당되지 않음모두껍데기.
모든 사람이 UNIX 모뎀 버전에서 모뎀 쉘을 사용하는 것은 아닙니다. (특정 운영 체제에 대한 표준으로 일부 공통 명령이 제공되지 않더라도 파이프라인의 명령이 설치된 모든 시스템에서 작동하는 방식으로 파이프라인을 작성하는 것이 유익할 수 있습니다.)