Existem heurísticas que podem ajudá-lo, mas não há uma maneira totalmente confiável.
Otheus mostra como usar descritores de arquivos . Essa é uma boa heurística, que funciona na maioria dos casos. No entanto, há casos extremos em que ele falha e não há como detectar falhas.
Exemplo: pegue o seguinte script.
#!/bin/sh
set
lsof -p$$ | sed 's/[0-9][0-9]*//'
Faça duas cópias do script, uma chamada foo
, uma chamada bar
. Agora vamos enfatizar isso um pouco:
$ env -i PATH=/bin:/usr/bin perl -MPOSIX -e 'dup2(4, 11) or die $!; exec "dash", "foo", "bar"' 3<foo 4<bar </dev/null >foo.out
$ env -i PATH=/bin:/usr/bin perl -MPOSIX -e 'dup2(3, 10) or die $!; exec "dash", "bar", "foo"' 3<foo 4<bar </dev/null >bar.out
$ diff foo.out bar.out
17c17 < traço gilles 1w REG 0,24 99 10130024 /tmp/202954/foo.out ---
dash gilles 1w REG 0,24 99 10130022 /tmp/202954/bar.out
A única diferença aqui é o arquivo no qual registrei a saída.
Outro caso em que essa heurística falharia seria se o shell fosse chamado na entrada padrão ou com -c
.
Outra abordagem é analisar a linha de comando do shell. No Linux, você pode acessá-lo através de /proc
. Os argumentos são delimitados por nulos, o que é difícil de analisar com ferramentas de shell portáveis (ferramentas GNU recentes tornam isso mais fácil), mas isso pode ser feito. Portavelmente, você precisa chamar ps
para acessar os argumentos, e não há nenhum formato de saída que não seja ambíguo: ps -o args
concatena os argumentos com espaços e pode ser truncado.
Mesmo no Linux, o problema que você encontrará aqui é que o shell pode ter sido chamado com opções desconhecidas pelo seu script, e uma dessas opções pode levar um argumento. Por exemplo, suponha que você tenha um script chamado 1
e outro script chamado 2
.
mksh -T 1 2
Isso invoca o mksh em /dev/tty1
e executa o script 2
.
zsh -T 1 2
Isso chama zsh com a opção cprecedences
e executa o script 1
com o argumento 2
.
Você precisa ter conhecimento de conchas individuais para diferenciá-las. Com esse método, você pode detectar casos extremos: se você vir uma opção fora do padrão, salve.