Ao tentar obter o PID de um comando shell, é possível usar um arquivo de script:
#!/bin/bash
ls -lha &
echo "$!"
No entanto, não é possível usar apenas o terminal.
/bin/bash -c 'ls -lha & ; echo "$!"'
Isso retorna o erro:
/bin/bash: -c: linha 1: erro de sintaxe próximo ao token inesperado `;'
O manual afirma o seguinte:
Uma lista é uma sequência de um ou mais pipelines separados por um dos operadores
;
,&
,&&
, ou||
, e opcionalmente terminados por um de;
,&
, ou<newline>
. Destes operadores de lista,&&
e||
têm precedência igual, seguidos por;
e&
, que têm precedência igual.Uma sequência de uma ou mais novas linhas pode aparecer em uma lista em vez de um ponto e vírgula para delimitar comandos.
Se um comando for encerrado pelo operador de controle
&
, o shell executa o comando em segundo plano em um subshell. O shell não espera o comando terminar, e o status de retorno é 0. Comandos separados por a;
são executados sequencialmente; o shell espera que cada comando termine por vez. O status de retorno é o status de saída do último comando executado.
Então eu também tentei usar nova linha, mas não consegui:
/bin/bash -c 'ls -lha & \n echo "$!"'
Como posso chamar um comando shell para ser executado em segundo plano e obter o PID?
PS: Não usarei ls
command e é um script mais complexo. Este é apenas um exemplo mínimo para reproduzir o problema.
Ambos
;
e&
são separadores de comando. Você precisa de um para separar ols
comando doecho
comando, mas não ambos. Apenas deixe de fora o;
e façaSe desejar, você pode adicionar uma nova linha:
ou use
$'…'
:Claro, você precisa ter separadores de comando entre os comandos; um entre cada dois comandos consecutivos. Então, se você quiser ter, digamos, quatro comandos, onde o primeiro é assíncrono e o resto é síncrono, você usaria