아래 첫 번째 명령이 마지막으로 인쇄되는 이유를 알고 싶습니다.
file=$(printf .tar.gz & printf test)
echo $file
test.tar.gz
예상한 대로 출력됩니다 .tar.gztest
.
답변1
주문하다비동기 명령보장되지 않으며 셸 및 운영 체제 스케줄러에 따라 다릅니다.
간단한 테스트(Mac OSX El Capital에서 실행 zsh
):
for shell in bash ksh zsh mksh yash dash; do
printf '[%s]\n' "$shell"
"$shell" -c 'file=$(printf .tar.gz & printf test); echo "$file"'
done
[bash]
test.tar.gz
[ksh]
test.tar.gz
[zsh]
.tar.gztest
[mksh]
.tar.gztest
[yash]
test.tar.gz
[dash]
test.tar.gz
내 Ubuntu 14.04 VM에서는 이러한 모든 쉘이 생성됩니다 test.tar.gz
.
답변2
&
이는 첫 번째 명령이 백그라운드로 전송되고 printf test
서브셸에서 백그라운드 명령이 완료된 후 서브셸이 종료되기 전에 메시지가 표시되기 때문입니다 . 하나를 생산하다test.tar.gz
디버그 모드에서는 명령의 순서가 다음과 같은 것을 볼 수 있습니다.
++ printf test
++ printf .tar.gz
+ file=test.tar.gz
+ echo test.tar.gz
이제 좀 더 명확해지기를 바라요