Considere o seguinte script wrapcat.sh (um wrapper para cat) para fins ilustrativos. É executado com busybox (ash) em uma caixa Linux 2.6 incorporada.
#!/bin/sh
cat $1
Em determinadas circunstâncias, esse script nem sempre sairá corretamente. Por exemplo, quando eu corro
$./wrapcat.sh /proc/pid/cmdline
para alguns pid , às vezes eu vou cair em um shell aguardando um comando. Depois de bater o retorno ou algo parecido, ele termina.
Meu diagnóstico é de que cat é interrompido por algum sinal e, portanto, o script não sai corretamente (já que não configuro nenhuma opção -e). Então, estou interessado no status de retorno do comando cat . Eu modifico o script da seguinte forma:
#!/bin/sh
cat $1
echo $? # echo the exit status
No entanto, o status de saída não é ecoado quando o script não consegue sair corretamente. 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 está indicando /proc/pid/cmdline ). O mesmo também ocorre às vezes quando catting /proc/pid/auxv e /proc/pid/environ . Função relevante na fonte: link
Eu não quero necessariamente saber como "consertar" isso, isso provavelmente pode ser feito definindo a opção -e mencionada anteriormente.
Nota: você provavelmente não conseguirá reproduzir isso em algo como o Ubuntu ou o Debian - o fenômeno pode ser específico de busybox ash, cat ou embedded Linux. Você pode, no entanto, simulá-lo interrompendo um processo filho sleep executado dentro de um script.
Por exemplo execute um script s.sh :
#!/bin/sh
sleep 1000
echo $?
Então, $./s.sh , ctrl-z, bg , disown %1 para executar o script em seu próprio processo. Agora em ps você verá algo como:
15610 pts/35 00:00:00 s.sh
15611 pts/35 00:00:00 sleep
Se você prosseguir e executar kill -2 15611 (no processo filho ), você observa
$ 130 # the exit status, which does get printed
command line waits for next command without clean exit