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