printf 주문?

printf 주문?

아래 첫 번째 명령이 마지막으로 인쇄되는 이유를 알고 싶습니다.

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

이제 좀 더 명확해지기를 바라요

관련 정보