;
, , 또는 연산자 의 상대적 바인딩 우선순위를 알고 있습니다 &
.&&
||
배쉬 문서.
그러나 파이프가 나에게 다가오면 &&
결속력을 이해하는 데 어려움을 겪고 올바른 명령을 우연히 찾거나 단순히 포기합니다.
|
위와 >
비교하여 바인딩 우선순위는 무엇입니까 ?
내가 혼란스러워하는 예 :
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;}
에 더 가깝습니다 .if
then
else
- 중괄호 구문에는 다음이 있습니다.~ 해야 하다다음 공백
{
과 앞에 있는 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
x=1 | od -ab
or 와 같은 것이 ls -laR | z=0
구문적으로 유효합니다.
파이프 1 && 파이프 2 || 파이프 3bash는 이를 "목록"이라고 부르고, POSIX는 이를 "AND-OR 목록"이라고 부릅니다. 마찬가지로 단일 "파이프" 또는 단일 "단순 명령"도 AND 또는 OR가 포함되어 있지 않더라도 "AND-OR 목록"으로 간주됩니다.
그리고 또는 목록 1 & 그리고 또는 목록 2 ; 그리고 또는 목록 3명명법이 약간 불일치하기 시작했습니다. Bash는 또한 이러한 "목록"을 호출합니다. POSIX는 이를 "목록", "복합 목록" 및 (드물게) "용어"라고 부릅니다. 마찬가지로 단일 "AND-OR 목록", "파이프라인" 또는 단일 "단순 명령"도 포함되지 않은 경우에도 "목록"으로 간주됩니다.
&
또는;
.(화합물 목록)그리고
{ 화합물 목록;}흐름 제어 명령(`for`, `if`-`then`-`else`, `while` 등)을 "복합 명령"이라고 합니다.
위의 예에서는 A
, 및 파이프로 B
해석하는 C
것이 가장 적합할 것입니다 . "파이프"는 단일 "간단한 명령"일 수 있으며 파이프를 포함할 필요는 없습니다.