Considere o seguinte script wrapcat.sh(um invólucro para gato) para fins ilustrativos. É executado com o busybox (ash) em uma caixa Linux 2.6 incorporada.
#!/bin/sh
cat $1
Sob certas circunstâncias, esse script nem sempre sai corretamente. Por exemplo, quando eu corro
$./wrapcat.sh /proc/pid/cmdline
para alguns pid, às vezes vou cair dentro de um shell aguardando um comando. Depois de pressionar retorno ou similar, ele termina.
Meu diagnóstico é que caté interrompido por algum sinal e, portanto, o script não sai corretamente (como eu não defini nenhuma opção -e). Então, eu estou interessado no status de retorno do catcomando. Eu modifico o script da seguinte maneira:
#!/bin/sh
cat $1
echo $? # echo the exit status
No entanto, o status de saída não é ecoado quando o script falha ao sair corretamente. Eu gostaria de saber por que o $?status de saída não é ecoado (e talvez mais especificamente por que uma saída limpa nem sempre acontece particularmente quando se faz o gato /proc/pid/cmdline). O mesmo também ocorre às vezes quando se faz gatos /proc/pid/auxve /proc/pid/environ. Função relevante na fonte: http://lxr.linux.no/#linux+v2.6.31/fs/proc/base.c#L253
Eu não quero necessariamente saber como 'consertar' isso, isso provavelmente pode ser feito configurando a opção -e acima mencionada.
Nota: você provavelmente não será capaz de reproduzir isso em algo como Ubuntu ou Debian - o fenômeno pode ser específico para o busybox ash, gato ou Linux incorporado. No entanto, você pode simulá-lo interrompendo um processo filho sleepexecutado dentro de um script.
Por exemplo, execute um script s.sh:
#!/bin/sh
sleep 1000
echo $?
Então $./s.sh, ctrl-z, bg, disown %1para executar o script em seu próprio processo. Agora psvocê verá algo como:
15610 pts/35 00:00:00 s.sh
15611 pts/35 00:00:00 sleep
Se você seguir em frente e executar kill -2 15611(no processo filho ), você observará
$ 130 # the exit status, which does get printed
command line waits for next command without clean exit
$ 130porque o processo em segundo plano produziu isso 130, seu shell não redesenha seu prompt, mas isso é esperado, pois não há como saber que algo foi gravado no terminal em segundo plano.