파이프 및 리디렉션과 분리, 조인 등에 대한 바인딩 우선 순위는 무엇입니까?

파이프 및 리디렉션과 분리, 조인 등에 대한 바인딩 우선 순위는 무엇입니까?

;, , 또는 연산자 의 상대적 바인딩 우선순위를 알고 있습니다 &.&&||배쉬 문서.

그러나 파이프가 나에게 다가오면 &&결속력을 이해하는 데 어려움을 겪고 올바른 명령을 우연히 찾거나 단순히 포기합니다.

|위와 >비교하여 바인딩 우선순위는 무엇입니까 ?

내가 혼란스러워하는 예 :

ls _thumbnails/video.mp4.jpg 2>/dev/null 
    && echo "thumbnail already generated. Not regenerating" \
    && exit \
    || ffmpeg_thumbnail_create video.mp4 2>/dev/null \
    && ls _thumbnails/video.mp4.jpg \
    && echo "Thumbnail successfully created" \
    && exit \
    || echo "Thumbnail creation failed" \
    | tee ~/thumbnails.log

위의 목표는 썸네일이 아직 존재하지 않는 경우에만 썸네일을 생성하는 것입니다(저는 매일 cronjob을 실행합니다). 그리고 나는 FFMpeg의 오류 없는 큰 출력을 좋아하지 않습니다(유닉스 방식이 아닙니다).

다른 경우도 있으므로 해당 프로그램에 특정한 별도의 문이나 특수 옵션을 사용하라는 제안은 도움이 되지 않습니다. 바인딩 우선 순위에 대해 알고 싶습니다.

답변1

<, , >, , 및 해당 변형이 가장 높은 바인딩 우선순위(가장 엄격한 바인딩)를 가지며 그 다음은 |, &&||, ;및 입니다 &. 그러므로 오직 echo "Thumbnail creation failed"로만 파이프될 수 있습니다 tee.

약간 더 긴 대답은 지적합니다제일 높은우선순위는 실제로 그룹화이며 괄호나 중괄호로 표현될 수 있습니다. 예를 들어,

A  &&  (B; C)

그리고

A  &&  { B; C;}

대략 동일함

if A
then
    B
    C
fi

노트:

  • 대괄호는 하위 쉘을 제공합니다. 즉, 명령이 하위 프로세스에서 실행 B됩니다 . C따라서 변수 할당과 같은 명령은 cd 상위 쉘에 영향을 미치지 않습니다. 중괄호로 묶인 명령은 명령과 동일한 프로세스에서 실행됩니다 A. 따라서 중괄호 구조는 - - 구조 A && { B; C;}에 더 가깝습니다 .ifthenelse
  • 중괄호 구문에는 다음이 있습니다.~ 해야 하다다음 공백 {과 앞에 있는 a ;( &또는 개행 문자) 입니다 }.

자세한 내용은 다음을 참조하세요.쉘의 제어 및 리디렉션 연산자는 무엇입니까?그리고"if"가 불필요한 경우는 언제입니까?(특히 내 대답).

~을 위한심지어자세한 내용은 다음을 참조하세요.bash(1) 매뉴얼 페이지그리고 Shell 명령 언어의 POSIX 사양/정의, 구체적으로단원 2.9, 셸 명령 그리고섹션 2.10.2, 쉘 구문 규칙. 이는 위에 대한 몇 가지 맥락을 제공하려는 시도입니다.

  • 그림
  • myVar=42
  • IFS= read a
  • date
  • cd /some/directory
  • ls -laR dir1 dir2
  • cat foo* > /tmp/allfoo
  • ls -laR dir{1,2}
  • find . -type f -name "foo*" -print > /tmp/output 2> /dev/null
  • > newfile
  • [ -f catfood ]
  • exit

모두 "간단한 명령"으로 간주됩니다.

  • 그림
      간단한 명령 1  |  간단한 명령 2  |  간단한 명령 3
    "파이프라인" 입니다. 문법은 이와 같은 형식적 문법(및 C와 같은 프로그래밍 언어)과 마찬가지로 빌딩 블록을 만들고 그 위에 구축하므로 파이프가 없더라도 단일 "간단한 명령"은 "파이프라인"으로 간주됩니다. 변수 할당에는 파이프라인의 일부로서 (의미론적) 의미가 없지만 x=1 | od -abor 와 같은 것이 ls -laR | z=0구문적으로 유효합니다.
  • 그림
      파이프 1  &&  파이프 2  ||  파이프 3
    bash는 이를 "목록"이라고 부르고, POSIX는 이를 "AND-OR 목록"이라고 부릅니다. 마찬가지로 단일 "파이프" 또는 단일 "단순 명령"도 AND 또는 OR가 포함되어 있지 않더라도 "AND-OR 목록"으로 간주됩니다.
  • 이런 일을 만났을 때
      그리고 또는 목록 1 &  그리고 또는 목록 2 ;  그리고 또는 목록 3
    명명법이 약간 불일치하기 시작했습니다. Bash는 또한 이러한 "목록"을 호출합니다. POSIX는 이를 "목록", "복합 목록" 및 (드물게) "용어"라고 부릅니다. 마찬가지로 단일 "AND-OR 목록", "파이프라인" 또는 단일 "단순 명령"도 포함되지 않은 경우에도 "목록"으로 간주됩니다.&또는;.
  • 그림
      (화합물 목록)
    그리고
    { 화합물 목록;}
흐름 제어 명령(`for`, `if`-`then`-`else`, `while` 등)을 "복합 명령"이라고 합니다. 

위의 예에서는 A, 및 파이프로 B해석하는 C것이 가장 적합할 것입니다 . "파이프"는 단일 "간단한 명령"일 수 있으며 파이프를 포함할 필요는 없습니다.

관련 정보