"고양이의 쓸모없는 사용"에 대한 일반적인 합의는 무엇입니까?


41

grep, sed, tr 등과 같은 여러 유닉스 명령을 파이프 할 때 cat을 사용하여 처리되는 입력 파일을 지정하는 경향이 있습니다. 그래서 같은 cat file | grep ... | awk ... | sed ....

그러나 최근에 이것이 쓸모없는 고양이의 사용이라는 것을 나타내는 몇 가지 의견이 내 대답에 남은 후에 나는 여기서 질문을 할 것이라고 생각했습니다.

나는 문제를 찾아보고 UUOC쓸모없는 고양이 사용 상 에 관한 Wikipedia의 기사를 보았 으며 , 주장은 효율성의 관점에서 나온 것 같습니다.

내가 여기에서 가장 가까운 질문은 이것이었다 : 고양이를 부르는 것은 낭비인가? –하지만 내가 원하는 것은 아닙니다.

UUOC 캠프가 제안하는 것은 cmd1 args < file | cmd2 args | cmd3 ..명령 에 사용 하거나 명령에 파일에서 읽을 수있는 옵션이있는 경우 파일을 인수로 전달하는 것입니다.

그러나 나 cat file | cmd1 ... | cmd2에게는 읽고 이해하기가 훨씬 쉬워 보입니다. 입력 파일을 다른 명령으로 보내는 다른 방법을 기억할 필요가 없으며 프로세스는 논리적으로 왼쪽에서 오른쪽으로 흐릅니다. 첫 번째 입력, 첫 번째 프로세스 등.

나는 쓸모없는 고양이의 사용에 대해 어떤 주장이 이루어지고 있는지 이해하지 못하고 있습니까? 처리가 많은 2 초마다 실행되는 크론 작업을 실행하면 고양이가 낭비 될 수 있음을 이해합니다. 그러나 그렇지 않으면 고양이 사용에 대한 일반적인 합의는 무엇입니까?


16
여기에 cat에 대한 호출이 비효율적 일 수 있지만 동의하면 나중에 명령을 이해하고 편집하기가 훨씬 쉬워지고 (중요하게 IMO는) 서로 다른 명령을 하나의 작업으로 분리하여 모든 것을 처리하기가 더 쉽습니다. 와.
Phoshi

4
일반적인 합의는 합의가 없다는 것입니다.
jwg

2

1
< file cmd1 args | cmd2 args ...그것도 효과가 있다는 것을 잊지 마십시오 ... " 왼쪽에서 오른쪽으로 " 라는 당신의 주장 은 무효입니다. 나는 종종 명확성을 위해 그것을 사용한다. 내가 보여준 순서는 사람들을 멈추게 할 수있다. 스레드 수가 많을수록 표준 IMO 문제는 줄어들고 있습니다.
Attie

답변:


21

그런 식으로 사용하면 다른 것을 달성하지 못하고 더 효율적인 옵션으로는 할 수없는 (즉, 적절한 결과 생성) 의미에서 쓸모가 없습니다.

그러나 cat그저 방법보다 강력 cat somefile합니다. 이 답변에 쓴 내용을 참조 man cat하거나 읽습니다 . 그러나 단일 파일의 내용 만 절대적으로 필요로하는 경우 파일 내용을 얻는 데 사용하지 않으면 성능상의 이점 을 얻을 수 있습니다.cat

가독성과 관련하여 이것은 개인적인 취향에 달려 있습니다. cat특히 성능 측면을 무시할 수있는 경우 같은 이유로 파일을 다른 명령에 넣는 것을 좋아 합니다.

또한 스크립팅 대상에 따라 다릅니다. 데스크탑 시스템을위한 자신의 쉘과 편리한 방법이라면, 당신 외에는 아무도 걱정하지 않을 것입니다. 체인의 다음 도구를 사용하는 것이 더 나은 경우를 우연히 발견하고 성능이 낮은 라우터 또는 이와 유사한 장치의 최소 Linux 시스템에서 자주 사용되는 소프트웨어로 배포하십시오. 처리 능력은 다릅니다. 항상 상황에 따라 다릅니다.


3
성능 비용은 무시할 수 있습니까? 많은 경우에 그들은 : oletange.blogspot.dk/2013/10/useless-use-of-cat.html
Ole Tange

15

매일 커맨드 라인을 사용하면 크게 다르지 않습니다. CPU를 사용하지 않으면 CPU 시간이 단축되므로 CPU 속도 cat가 유휴 상태가 되므로 속도 차이를 느끼지 못할 것 입니다. 실용적으로 수백 또는 수천 (또는 수십만) 항목을 반복하더라도 매우로드 된 시스템 (로드 평균 / N CPU> 1)이 아니라면 차이는 없습니다.

고무가 길을 만나는 곳은 좋은 습관을 형성하고 나쁜 습관을 낙담시키는 것입니다. 곰팡이가 많은 진부한 소리를 끌기 위해 악마는 세부 사항에 있습니다. 그리고 평범한 것과 큰 것을 분리하는 것은 이와 같은 세부 사항입니다.

차를 운전하는 것과 같습니다. 대신 세 개의 권리를 만들 수 있는데 왜 좌회전합니까? 물론 가능하며 완벽하게 작동합니다. 그러나 좌회전의 힘을 이해한다면 세 가지 권리는 바보처럼 보입니다.

하나의 파일 핸들, 17k의 RAM 및 0.004 초의 CPU 시간을 저장하는 것이 아닙니다. 유닉스 사용의 철학에 관한 것이다. 내 그림에서 "왼쪽 회전의 힘"은 단순히 입력을 리디렉션하는 것이 아니라 UNIX 철학입니다. 이를 완전히 이해하면 주변 사람들보다 훨씬 뛰어나게되고 이해하는 사람들로부터 존경을 받게됩니다.


2
신호등없이 6 차선 바쁜 고속도로로 좌회전하는 것을 생각하고 있다면 우회전하거나 다른 경로를 이용하는 것이 좋습니다. * nix는 여러 경로를 선택할 수 있습니다. 개인적인 취향과 가독성의 문제입니다. "cat file | cmd1 | cat | cmd2 | more"를 원하면 계속 진행하십시오. (때때로 cmd1이 페이지 매김을하면 유용합니다-cat이이를 제거합니다.) $ CPU time << $ Brain time.
MikeP

1
@MikeP 어떤 응용 프로그램에서는 페이징을 제거 cat있지만 페이지 매김을 제거하지는 않습니다 .
트리플 리

14

나는 종종 cat file | myprogram예제에서 사용 합니다. 때때로 나는 고양이의 쓸모없는 사용 ( http://www.iki.fi/era/unix/award.html ) 에 대한 비난을 받고 있습니다 . 다음과 같은 이유로 동의하지 않습니다.

무슨 일이 일어나고 있는지 이해하기 쉽습니다.

UNIX 명령을 읽을 때는 명령 뒤에 인수와 경로 재 지정이 필요합니다. 이다 리디렉션 어디를 넣을 수 있지만 거의 보이지 않는다 - 따라서 사람들이 열심히 시간을 예를 읽고있을 것이다. 나는 믿는다

    cat foo | program1 -o option -b option | program2

보다 읽기 쉽다

    program1 -o option -b option < foo | program2

리디렉션을 처음으로 옮기면이 구문에 익숙하지 않은 사람들을 혼란스럽게합니다.

    < foo program1 -o option -b option | program2

예제는 이해하기 쉬워야합니다.

변경하기 쉽습니다.

프로그램이 cat에서 읽을 수 있다는 것을 알고 있다면 일반적으로 STDOUT으로 출력되는 모든 프로그램의 출력을 읽을 수 있다고 가정 할 수 있으므로 자신의 필요에 맞게 조정하여 예측 가능한 결과를 얻을 수 있습니다.

STDIN이 일반 파일이 아닌 경우 프로그램이 실패하지 않는다고 강조합니다.

program1 < foo작동 하면 작동 한다고 가정하는 것은 안전하지 않습니다 cat foo | program1. 그러나, 그것은 이다 반대를 가정하는 연습 금고에. 이 프로그램은 STDIN이 파일 인 경우 작동하지만 seek를 사용하므로 입력이 파이프 인 경우 실패합니다.

    # works
    < foo perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

    # fails
    cat foo | perl -e 'seek(STDIN,1,1) || die;print <STDIN>'

http://oletange.blogspot.dk/2013/10/useless-use-of-cat.html 에서 성능 저하를 살펴 봤습니다 cat file |. 처리의 복잡성이 단순한 grep과 유사하면 결론은 사용되지 않습니다. 성능은 가독성보다 중요합니다. 다른 상황 cat file |에서는 괜찮습니다.


1
마지막으로 실제 벤치 마크에 대한 답변입니다. 나는 또한 나의 의견에 "때때로"고양이가 더 빠를 수 있다고 언급했다. "cat의 쓸모없는 사용"이 실제 손해임을 상상할 수있는 유일한 시간은 huuuge 파일에 대해 사소한 처리를 수행하는 경우 (또는 프로세스가 tail 명령과 같은 stdin을 특수하게 사용할 수있는 경우) ... unix.stackexchange입니다. com / a / 225608 / 8337
rogerdpack

12

UUOC라는 것에 대해 언급하는 사람들 중 일부가 취하는 입장은 유닉스와 쉘 구문을 실제로 이해한다면 그 맥락에서 고양이를 사용하지 않을 것입니다. 문법을 사용하지 않는 것 같습니다. 문법을 사용하여 문장을 작성하고 요점을 파악할 수는 있지만 언어에 대한 이해력과 확장 성이 부족한 교육에 대해서도 잘 알고 있습니다. 무언가가 UUOC라고 말하는 것은 누군가 자신이하는 일을 이해하지 못한다고 말하는 또 다른 방법입니다.

효율성이 향상되는 한, 명령 줄에서 파이프 라인을 실행하는 경우 cat somefile |사용하는 것이 더 효율적인지 생각 하는 것보다 기계를 실행하는 데 걸리는 시간이 줄어 듭니다 < somefile. 그것은 중요하지 않습니다.


6
꽤 오랫동안 나는 cat somefile | prog고양이없이 쉘로 표현할 수 있는 다른 방법들이 있다는 것을 알고 prog < somefile있었지만, 그것들은 항상 나에게 잘못된 순서로있는 것처럼 보였다. 이제 나는 < somefile prog그 트릭 만큼이나 우아한 것을 보았습니다 . 감사합니다. 나는 고양이를 사용하기 위해 떠난 변명을 다했다.
Alex

4

나는 어떤 신인이 내 대답 중 하나를 위해 UUOC를 고정하려고 시도했을 때까지 그 상을 알지 못했습니다. 이었다 cat file.txt | grep foo | cut ... | cut .... 나는 그에게 내 마음의 한 조각을 주었다. 그렇게 한 후에야 그는 그 링크를 방문하여 그상의 기원과 그렇게하는 관행을 언급하게되었다. 더 많은 검색을 통해이 질문으로 이어졌습니다. 안타깝게도 의식적인 고려에도 불구하고 어떤 대답도 나의 근거를 포함하지 않았다.

나는 그를 교육 할 때 방어 적이 지 않았습니다. 결국, 어린 시절 grep foo file.txt | cut ... | cut ...에 자주 단일 싱글을 수행 할 때마다 grep파일 인수의 배치를 배우고 첫 번째가 패턴이고 후자가 파일 이름이라는 준비가되어 있기 때문에 명령을 작성했을 것입니다.

cat"좋은 맛"(리누스 토발즈의 말로) 이유 때문에 주로 접두사로 질문에 대답했을 때 의식적인 선택이었습니다 .

후자의 이유가 더 중요하므로 먼저 설명하겠습니다. 파이프 라인을 솔루션으로 제공하면 재사용 할 수있을 것으로 기대합니다. 파이프 라인은 다른 파이프 라인의 끝에 추가되거나 다른 파이프 라인에 연결될 가능성이 높습니다. 이 경우 grep하는 파일 인수를 사용하면 재사용 성이 향상되고 파일 인수가 존재하는 경우 오류 메시지없이 자동으로 수행 할 수 있습니다. 나. grep foo xyz | grep bar xyz | wc얼마나 많은 라인에서 당신을 줄 것 xyz포함 bar하면 모두 포함하는 행의 수를 예상하는 동안 foobar. 파이프 라인에서 명령에 대한 인수를 사용하기 전에 명령을 변경해야하는 경우 오류가 발생하기 쉽습니다. 침묵 실패의 가능성을 추가하고 특히 교활한 연습이됩니다.

이전의 이유는 "좋은 맛"이 많기 때문에 교육을 필요로하는 사람이 "그렇지 않다"고 말하는 순간에 바로 생각할 수없는 위의 침묵 실패와 같은 것에 대한 직관적 인 잠재 의식적 이론적 근거이기 때문에 중요하지 않습니다. 그 고양이 쓸모없는 ".

그러나 나는 또한 내가 언급 한 이전의 "좋은 맛"이유를 의식적으로 만들려고 노력할 것이다. 그 이유는 Unix의 직교 디자인 정신과 관련이 있습니다. grep하지 않습니다 cutls하지 않습니다 grep. 따라서 최소한 grep foo file1 file2 file3디자인 정신에 위배됩니다. 그것을하는 직교 방법은입니다 cat file1 file2 file3 | grep foo. 이제는 grep foo file1의 특별한 경우 일 뿐이며 grep foo file1 file2 file3, 동일하게 취급하지 않으면 적어도 쓸모없는 고양이 상을 피하려고하는 두뇌 시계 사이클을 사용하고 있습니다.

그것은 우리를 grep foo file1 file2 file3연결 시키는 논쟁으로 이끈다 . 그리고 cat그것이 합당 해 지도록 합당하게 연결되어 있기 때문에 연결되어 있지 cat file1 file2 file3않기 때문에 우리는 전능하신 유닉스 의 정신을 위배한다 . 그렇다면, 유닉스는 한 파일의 출력을 읽고 stdout에 뱉어 내기 위해 다른 명령이 필요할 것입니다 (파일을 파기하거나 stdout에 대한 순수한 침을 뱉는 것이 아닙니다). 당신은 당신이 말하는 상황을했을 그래서 하거나 말을 하고 양심적으로 방지하기 위해 기억 도 피하면서, 상을 받고 피하기 위해 의 희망 디자인 때문에 여러 개의 파일을 지정하는 경우 오류가 발생합니다.catcat file1 | grep foocatcat file1 file2dog file1cat file1dog file1 file2dog

이 시점에서 파일을 stdout에 뱉어내는 별도의 명령을 포함하지 cat않고 다른 이름을 지정 하는 대신 연결을위한 이름 을 지정하는 데 대해 Unix 디자이너와 동정 하기를 바랍니다. <edit>불행한 <연산자 같은 개가 있습니다. 파이프 라인 끝 부분에 배치하면 안타깝게도 쉽게 작곡 할 수 있습니다. 처음에 구문 적으로 또는 미적으로 깨끗한 방법은 없습니다. 그것은 일반적으로 충분하지 않아 불행히도 개로 시작하지만 이전 파일 이후에 처리하려면 다른 파일 이름을 추가하십시오. ( >반면에 절반은 나쁘지 않습니다. 끝 부분에 거의 완벽한 배치가 있습니다. 일반적으로 파이프 라인의 재사용 가능한 부분이 아니기 때문에 상징적으로 구별됩니다.)</edit>

다음 질문은 더 이상 처리하지 않고 단순히 파일을 뱉어 내거나 여러 파일을 stdout에 연결하는 명령을 갖는 것이 중요한 이유는 무엇입니까? 한 가지 이유는 표준 입력에서 작동하는 모든 단일 Unix 명령이 하나 이상의 명령 행 파일 인수를 구문 분석하고 존재하는 경우이를 입력으로 사용하는 방법을 알기위한 것입니다. 두 번째 이유는 사용자가 다음을 기억하지 않도록하기위한 것입니다 : (a) 파일 이름 인수가가는 곳; (b) 위에서 언급 한 바와 같이 무성 파이프 라인 버그를 피하십시오.

그것은 왜 우리에게 grep여분의 논리가 있는지 알려줍니다 . 이론적 근거는 파이프 라인이 아닌 자주 사용되는 독립형 명령에 대한 사용자 유창성을 허용 하는 것입니다. 유용성이 크게 향상되기 위해 직교성이 약간 손상되었습니다. 모든 명령을 이런 식으로 설계해야하는 것은 아니며 자주 사용하지 않는 명령은 파일 인수의 추가 논리를 완전히 피해야합니다 (추가 논리는 불필요한 취약성을 초래합니다 (버그 가능성). 의 경우와 같은 파일 인수를 허용하는 것은 예외입니다 grep. (참고 ls로 파일 인수를 수락 할뿐만 아니라 거의 파일 인수를 요구하는 완전히 다른 이유가 있습니다.)

마지막으로, 표준 입력을 사용할 수있는 경우와 같은 예외적 인 명령 이 오류를 생성하는 경우 grep( 더 나은 것은 아님 ls) 더 잘 수행 할 수 있습니다. 명령에 사용자 편의를 위해 전능 한 Unix의 직교 정신을 위반하는 논리가 포함되어 있기 때문에 이는 합리적입니다. 추가적인 사용자 편의, 즉 자동 장애로 인한 고통을 방지하기 위해, 이러한 명령은 자동 장애의 가능성이있는 경우 사용자에게 경고하여 자신의 위반을 위반하는 것을 망설이지 않아야합니다.


1
이 답변과 질문의 교차 사이트 복제본에서 설명한 것처럼 grep pattern f1 f2 f3간단한 연결은 아닙니다 . grep파일에 대해 알고 파일 이름 (및 선택적으로 줄 번호 등)을 인쇄합니다. grep . /sys/kernel/mm/transparent_hugepage/*한 줄 파일이 많은 파일 내용 : 파일 이름을 인쇄하기위한 좋은 해킹입니다. 고전적인 유닉스 디자인은 대부분의 유틸리티 *.txt가 필요없이 작동 한다는 것 cat입니다. cat여러 파일을 하나의 스트림으로 병합하기위한 것입니다.
Peter Cordes

@PeterCordes 나는 grep에 대해 너무 많이 쓰지 않았습니다. 오류 / 복사 붙여 넣기에 대한 견고성과 관련하여 관찰 한 실질적인 문제가 있습니다. 소소한 / 주변적인 관심사를지지하기 위해 편리하게 무시하기로 선택한 정확성 대 성능.
randomstring

파이프 라인을 복사 / 붙여 넣기 할 때 발생할 수있는 오류에 대해 흥미롭고 유효한 포인트를 만듭니다. 여러 파일을 신경 쓸 이유가 없으며 항상 stdin에서 제공 할 수 grep있는 프로그램으로 예제를 바꾸는 것이 좋습니다 cut. 일부 유틸리티는 같은 tr선택은 사이하므로, 파일에 모두 인수, 및 필터로만 작업을 허용하지 않습니다 cat<.
Peter Cordes

1
게시물의 가장 큰 문제는 입력 리디렉션을 할인한다는 것입니다. <file cmd1 | cmd2 >out훌륭하지는 않지만, 그것에 익숙해지는 것이 가능합니다. 당신은 "전능 한 유닉스의 정신"에 대해 조롱하는 방식으로 계속 진행하고 있습니다. 그것은 유닉스 디자이너들이 실제로 생각했던 방식을 얻지 못하거나 원하지 않는 것처럼 들리기 때문에 완전히 평평합니다. 유닉스 디자인이 마음에 들지 않으면 괜찮지 만 본질적으로 바보는 아닙니다. OS의 디자인이 셸 구문보다 앞서 있는지, 그리고 그것이 어떻게 진화했는지 확실하지 않지만 cat1970 년에 추가 된 것은 피할 가치가 있습니다!
Peter Cordes

1
@PeterCordes 뒤늦은 대답에서 가장 긴 시간이 걸렸습니다. 가장 중요한 점-정확성 우선, 최적화 둘째-. 추가 기능 cat은 파이프 라인을 재사용하고 스플 라이스하는 데 도움이되는 반면 자동 실패가 발생할 수 있습니다 (제 대답에서 "자동"검색).
randomstring

2

고양이의 쓸모없는 사용을 방어

(이 연습과 잔소리 코멘트의 쓰나미의 균형을 돕기 위해 몇 단락)

나는 bash와 작은 스크립트를위한 스크립팅 언어 및 때로는 작은 스크립트를위한 스크립팅 언어로 너무 오랫동안 bash를 사용해 왔습니다. 오래 전에 저는 "유용하지 않은 고양이 사용"(UUoC)에 대해 배웠습니다. 나는 적어도 매주 그것에 대해 유죄 이지만 솔직히 나는 그것을 피하도록 강요된 느낌조차 거의 없다. 나는 catvs 를 사용하는 < file것이 기술적 차이보다 맛에 관한 것이라고 생각 하며 내 취향을 공유하는 Linux를 처음 사용하는 사람들을 보호하기 위해이 답변을 썼습니다.cat그들의 길에 심각한 문제가 있다고 생각하는 것으로부터 (그리고 몇 가지 경우가 있음을 주목하십시오). Linus Torvalds와 마찬가지로 나는 또한 종종 맛이 기술보다 중요하다고 생각합니다. 그것은 내 취향이 당신의 취향보다 낫다는 것을 의미하지는 않지만, 어떤 것이 나쁜 취향이라면 가치있는 것을 얻지 않고는 그것을하지 않을 것임을 의미합니다.

이 질문의 저자처럼 이미 분명 내가 느끼는 나는 점차적으로 복잡한 명령을 구성하여 문제를 탐구하고있어 떠들썩한 파티 같은 REPL에서 작업 할 때 고양이를 사용하는 것은 매우 자연입니다. 다음은 매우 일반적인 예입니다. 텍스트 파일이 있는데 그에 대해 잘 모르고 있습니다. cat file내용의 맛을 얻기 위해 타이핑 합니다. 경우 출력이 너무 많은 것입니다 나는 화살표를 내 띄워거야, 그리고 상황에 따라 내가 추가 할 것입니다 | head하거나 | grep foo또는 | what_ever처리하는 단계를 추가하여 내 이전 명령을 확장. 하나의 처리 단계를 추가하여 간단한 명령에서 더 복잡한 명령으로 점진적으로 이동하는이 방법은 나에게 매우 자연스러운 느낌입니다 (ipython에서 동일한 작업을 수행하고 있습니다.pyfunctional유사한 프로그래밍 도구가이 스타일을 포함합니다). bash 쉘의 작업 그래서 나는 '내 흐름을 방해하면 제거 할 수 있다고 확신 해요 cat입니다 더 쓸모 가 있어야하며 경우 99.9 %에 ... 전혀 잘 어떤 결과로 고통을하지 않습니다 수 있도록보다.

물론 스크립트를 작성할 때 상황 바뀔 있습니다. 그러나 스크립트를 작성할 때조차도 UUoC를 조롱하는 사람들이이 중요한 교훈을 " 마음의 조기 최적화는 모든 악의 근원" 이라고 무시합니다 . 그리고 비정형적인 작업을 수행하지 않으면 UUoC를 최적화가 필요한 곳에 배치하기가 정말 어렵습니다. 물론 당신 은 그것에 대해 비효율적 인 것이 무엇인지 반드시 알아야합니다 . 프로세스 호출 비용이 비싼 드문 시스템 (예 : 일부 임베디드 시스템 또는 CygWin)이 작을 경우 그러한 지식이 있으면 특별한 상황에서 필요한 경우 수행 할 작업을 알게됩니다. 예를 들어 자신이 전화하는 것을 발견하면cat루프에서 1 초에 여러 번 (BTW가 해당 위치에있는 경우 bash가 작업에 적합한 도구인지 스스로에게 문의하십시오). 다시 : "먼저 제대로 작동하게하고 필요한 경우 최적화하십시오" .

UUoC Nick에 대한 불만의 쓰나미를 어떻게 설명합니까?

많은 사람들이 UUoC에 대해 불평하는 이유는 대부분 기술적 인 것이 아니라 인간이라고 생각합니다. 대부분의 유닉스 신입생들은 < file command관용구 에 대해 알지 못 하기 때문에 경험이 많은 사람에게 "Old Guru" " 그들에게. 또한 멋진 단어 ( "프로세스 호출")를 사용하고 "최적화"의 소중한 주제를 만질 수있는 기회도 갖게됩니다. 좋은 인상이 보장되므로 저항하기가 매우 어렵습니다. 그런 다음 새로 온 사람들은 전문가의 조언을 액면가로 받아들이고 오랫동안 다른 사람들에게 "유일한 진실"(그리고이 답변을 다운-투표)로 재생할 것입니다. 재미있는 메모 : UUoC의 비 효율성을 피하기 위해 bash를 수정하는 것이 너무 쉬울 것입니다.< filename몇 년 후 파일을 고양이. 어두운 영혼은 일부 회색 수염 bash 해커가 우리를 조롱 할 기회를 남기기를 좋아합니다.


+1 왜이 관행을 전파하는 인류 학적 요인이 있는지에 대한 마지막 단락을 좋아하십시오 :-)
randomstring

1

정말 좋은 것은 다음과 같은 구문을 지원하는 쉘입니다.

< filename cmd | cmd2 cmd2arg1... | cmd3

그 동안 cat filename | realcmd1...파일 이름을 인수로 요구하는 초기 명령으로 구문을 표준화했기 때문에 수용 가능한 것으로 생각합니다.


17
배쉬 및 유사한 쉘 지원 < filename cmd | cmd2 .... 충분히 가깝습니까?
garyjohn

@ garyjohn : 대답으로 게시해야한다고 생각합니다.
Kevin Reid

14
의무적 인 오래된 쉘 해커의 의견 : Bourne 스타일의 쉘은 < file command ...80 년대 중반부터 원본 sh이 쓰여졌을 때 70 년대까지 지원했습니다 . 보다 일반적으로, i / o 재 지정은 왼쪽에서 오른쪽으로 구문 분석되며 명령 행 내에서 임의의 순서로 산재 될 수 있습니다. 따라서 cmd <file arg arg...유효합니다.
데일 Hagglund

3
예, UUOC를 발명 한 것은 입력하기가 쉽기 때문입니다.
Randal Schwartz '

2
한 문자 이동 대 네 문자 이동은 그다지 큰 차이가 아니며, 추가 프로세스를 생성하여 전화로도 거의 알지 못합니다 . 파일을 프롬프트에 파일로 파이프하는 것보다 볼 때마다 두통이 발생합니다. .
Aaron Miller

0

고양이가 "냄새가 나거나"더 읽기 쉽기 때문에 사용할 수 있다고 말하는 모든 사람들에게 나는 이렇게 말할 것이다.

아마도 당신에게 ...하지만 코드를 읽거나 이해하려고 시도하는 다른 사람들에게는 아닙니다. 다른 사람들에게 당신의 예제를 가르치거나 코드를 공유하려고 시도하지 않는다면 반드시 자신의 여가에서 사용하십시오.

또한이 주석을 오랫동안 리눅스 사용자와 관리자 / 엔지니어로서 추가 할 것입니다. 왜? 리소스를 엄격하게 제어하는 ​​시스템에서 리소스를 사용하기 때문입니다. cat 명령과 파이프 자체는 완전히 쓸모없는 여분의 메모리와 파일 핸들을 사용합니다. 내 시스템에 무료로 필요한 리소스를 연결했으며 이러한 리소스의 사용법을 설명 할 수있는 아무것도 얻지 못했습니다. 이것은 큰 아니오 아니오입니다.

이제 나는 여기에 앉아서 누군가와 코드 냄새 또는 가독성과 같은 것들에 대해 토론 할 수 있지만, 하루가 끝날 때 그것은 쓰기 또는 잘못된 문제이며 언제든지 시스템에서 리소스를 사용하고 아무것도 얻지 못합니다 ... 그건 틀렸어.

개인 사용자는 나의 조언으로부터 배우고 일을하는 더 좋은 방법을 배우거나 고양이의 "냄새"에 의해 눈을 멀게 할 수 있습니다. 그러나 당신이이 연습을 공개적으로 사용한다면 당신은 이 연습에서 항상 그리고 당신은 조용히 그들이 옳다는 것을 인정해야하고 당신은 그것이 사실이기 때문에 완고합니다. :-)


또한 오랜 Linux (및 이전 * nix) 사용자 및 소프트웨어 개발자이기도합니다. 당신은 "우리의 눈을 피가 나게한다"고 말할 때 나를 위해 말하지 않습니다 cat foo.txt | .... 다른 답변은 왜 그것이 좋은 사용법이 될 수 있는지 잘 설명합니다. 이 사례에 대한 간단한 요약은 "$ CPU time << $ Brain time"입니다 (위의 @MikeP).
Jim DeLaHunt

첫째, 그것은 2017 년의 대답이었습니다 (죽은 lol을 부활시키는 방법). 둘째, 관리자 또는 개발자는 가능한 한 항상 리소스 사용을 최소화하기 위해 노력해야합니다. 앱과 서비스를 작성할 때 앱 / 서비스에 거의 도움이되지 않는 메모리 또는 CPU 소모량을 보려고합니까? UUOC는 바로 그 것입니다. 이제 고양이를 완벽하게 사용할 수 있습니다. 명령에 파이핑하는 것이 일반적입니다. 자주는 아닙니다. 그래서 당신이 말한 것처럼 나는 당신을 위해 말하지 않을 수도 있습니다 ...하지만 당신이 전문가라면 나는 왜 당신이 더 쉽게 동의하지 않는지 궁금합니다 (진실한 UUOC 시나리오가 주어졌습니다).
David Dreggors

문제는 메모리 또는 CPU 소모가 개발자가 최적화하는 유일한 비용이 아니라는 것입니다. 인적 시간, 문제를 이해하고 구현을 작성 및 디버깅하는 데 드는 시간도 절충의 일부입니다. 여기에있는 답변 중 일부는 사람의 시간이 메모리 나 CPU보다 훨씬 부족하고 비싸다는 판단에 근거합니다. . … 그러나 이것은 규칙에 위배되는 토론이되고 있습니다. 답변에 대한 투표에서 수퍼 유저가 어떤 관점을지지하는지 말하십시오.
Jim DeLaHunt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.