다시 bash 리디렉션: 2개의 유사한 명령을 이해하기 어려운 문제

다시 bash 리디렉션: 2개의 유사한 명령을 이해하기 어려운 문제

누군가가 다음 이유를 설명할 수 있기를 바랍니다.하다일하다:

# < /dev/urandom  tr -dc 'a-zA-Z' | head -c 12

이전에 "|" 없음, 그러나 다음과 같은 경우에는 그렇지 않습니다.

# < /dev/urandom | tr -dc 'a-zA-Z' | head -c 12

(이것은 간단한 비밀번호 생성기입니다)

다음과 어떻게 다른지 설명할 수도 있습니다.

# gunzip < HP-Fax4-hpcups.ppd.gz cat > ouT1 --- 물론 이것은 실패합니다.

gzip: cat.gz: No such file or directory 

그러나 cat 앞에 '|'가 제외되면 (pipe) 앞에 '|'와 함께 사용할 수 있습니다 cat.

 # gunzip < HP-Fax4-hpcups.ppd.gz | cat >  ouT1

답변1

  1. 무엇인가요 <?

    파일에서 읽기 위해 명령 입력을 리디렉션하는 것입니다. 명령 앞이나 뒤에 넣을 수 있습니다.

    $ echo abcd > in
    $ cat in
    abcd
    $ cat <in
    abcd
    $ <in cat
    abcd
    

    간단히 말해서 이 명령은 파일을 읽습니다. cat in와 의 차이점 cat <in<프로세스에 대해 STDIN(표준 입력)의 리디렉션을 설정하는 대신 명령이 내부적으로 작업을 수행해야 하는 매개변수 라는 cat것입니다 . (열어서 읽어보세요.)cat inincat

  2. 무엇인가요 |?

    프로세스의 리디렉션입니다. 다음 명령만 따를 수 있습니다.

    $ | cat in
    bash: syntax error near unexpected token `|'
    $ cat in | cat
    abcd
    $ cat in | cat |
    > 
    

    (...입력을 기다리는 중...)

  3. 이것은 무엇을 하는가: < /dev/urandom tr -dc 'a-zA-Z' | head -c 12?

    더 작은 부분으로 나누세요(리디렉션이 포함된 명령).

    • < /dev/urandom tr -dc 'a-zA-Z'= tr -dc 'a-zA-Z'그리고< /dev/urandom

      의미: 읽은 내용의 번역입니다 urandom.

    • |- 익명 파이프를 사용하여 프로세스로 리디렉션

    • head -c 12- 리다이렉트를 받는 과정입니다.

    이 전체 라인이 의미가 있지 않습니까?

  4. 이것은 무엇입니까: < /dev/urandom | tr -dc 'a-zA-Z' | head -c 12?

    분해:

    • < /dev/urandom-주문 불가그리고 에서 리디렉션/dev/urandom
    • |- 익명 파이프를 사용하여 프로세스로 리디렉션
    • tr -dc 'a-zA-Z'- 리디렉션을 받는 프로세스
    • 등...

    어떻게 되어가나요? 첫 번째 "문장"에는 명령이 없습니다.

  5. 무엇인가요 >?

    그러면 이 명령의 출력이 파일로 리디렉션됩니다. 와 동일하며 <명령 앞이나 뒤에 사용할 수 있습니다.

    $ >out echo abcd
    $ cat out
    abcd
    $ echo dcba >tuo
    $ cat tuo
    dcba
    
  6. 이것은 무엇을 하는가: gunzip < HP-Fax4-hpcups.ppd.gz | cat > ouT1?

    분석하다:

    • gunzip < HP-Fax4-hpcups.ppd.gz= HP-Fax4-hpcups.ppd.gz다음으로 리디렉션( 이 파일을 읽 gunzip겠습니다 )gunzip
    • |- 출력을 프로세스로 리디렉션
    • cat > ouT1=는 cat리디렉션을 수신한 다음 해당 출력을 파일로 리디렉션하는 프로세스입니다.ouT1

    괜찮아요. 모든 부분이 의미가 있습니다.

  7. 그래서 이것은 무엇입니까: gunzip < HP-Fax4-hpcups.ppd.gz cat > ouT1?

    관련된 모든 당사자가 이에 대해 어떻게 말해야 하는지 100% 확신할 수는 없지만 추측해 보겠습니다. 오류는 다음과 같습니다.

    gzip: cat.gz: No such file or directory 
    

    이 오류의 첫 번째 단어는 gzipgzip이 실행되었음을 알리는 것입니다. 우리는 또한 명령을 해석하기 전에 판매에 의해 리디렉션이 설정된다는 것을 알고 있습니다(적어도 저는 알고 있습니다). 그래서 저는 이렇게 분석합니다.

    • < HP-Fax4-hpcups.ppd.gz-shell은 프로세스 입력 리디렉션을 HP-Fax4-hpcups.ppd.gzie로 설정합니다. 실행할 명령은 이 파일에서 읽혀집니다.
    • > ouT1- 명령의 출력은 다음으로 리디렉션됩니다.ouT1

    여태까지는 그런대로 잘됐다. 이제 테이블에 남은 것은 입니다 gunzip cat. 이에 대한 표준 설명은 이것이 gunzip명령이자 cat인수라는 것입니다. 이제 gunzipIN 및 OUT 리디렉션이 설정된 상태로 실행되고 cat첫 번째 인수로 문자열을 가져옵니다. 어떻게 든 오류가 발생합니다.

    gzip: cat.gz: No such file or directory
    

    또 무슨 뜻인가요? gzip찾을 수 없다고 하더군요 cat.gz. 그 파일로 뭔가를 하고 싶어하지만(열 가능성이 높음) 그러한 파일이나 디렉터리가 없습니다. 그러므로 그것을 인수로 cat.gz사용해야 하는 이유는 내부적인 문제임에 틀림없다. cat간단한 실험에서는 gzip 형식의 인수가 필요하다는 것을 보여줍니다.

    $ echo asdf > cat.gz
    $ gunzip < in  cat >  ouT1
    
    gzip: cat.gz: not in gzip format
    

    여기 파일은 in간단한 텍스트 파일이므로 빈 줄이 있다고 가정합니다.

관련 정보