Ordem de printf?

0

Estou me perguntando por que o seguinte imprime o primeiro comando por último?

file=$(printf .tar.gz & printf test)
echo $file

Emite test.tar.gz , mas esperaria .tar.gztest .

    
por Philip Kirkbride 18.08.2017 / 03:56

2 respostas

4

A ordem dos comandos assíncronos não é garantida e dependerá do shell e agendador do sistema operacional.

Um teste simples (executado com zsh no Mac OSX El Capital):

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

Na minha VM Ubuntu 14.04, todos esses shells produzem test.tar.gz .

    
por 18.08.2017 / 04:14
1

Isso ocorre porque & envia o primeiro comando para segundo plano e, depois de terminar printf test , o comando background do subshell mostra as informações antes da saída da sub-camada. produzindo test.tar.gz

no modo de depuração, você pode ver a ordem dos comandos como

++ printf test
++ printf .tar.gz
+ file=test.tar.gz
+ echo test.tar.gz

A esperança está um pouco mais clara agora,

    
por 18.08.2017 / 04:09

Tags