Eu tenho um script launch.sh
que se executa como outro usuário para criar arquivos com o proprietário correto. Eu quero passar -x para esta invocação se ela foi originalmente passada para o script
if [ `whoami` == "deployuser" ]; then
... bunch of commands that need files to be created as deployuser
else
echo "Respawning myself as the deployment user... #Inception"
echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
sudo -u deployuser -H bash $0 "$@" # How to pass -x here if it was passed to the script initially?
fi
Eu li a página de depuração do bash, mas parece não haver uma opção clara que indique se o script original foi iniciado com -x
.
[[ $- == *x* ]]
para a correspondência de padrões.case $- in *x*) ... ;; *) ... ;; esac
. É útil conhecer esse uso decase
scripts que devem ser portáteis e, agora que eu o conheço, acho mais fácil lembrar disso, do que lembrar "se for específico do bash, então[[
, maiscase
".$-
saídashB
. O que o-h
e-B
bandeiras / argumentos fazer? Não o veja na página do manual do bash .set -o
produziráxtrace on
se-x
for usado, caso contrárioxtrace off
.fonte
Embora a resposta do @Patrick seja a "correta", você também pode simplesmente passar um parâmetro ou variável exportada para o script filho que diz o que fazer - como ativar o rastreamento.
Isso tem a desvantagem de que (acredito) você precise reexportá-lo para cada nível de script que está prestes a inserir.
Tem a vantagem de ser capaz de rastrear seletivamente (ou afetar de outra forma) apenas os scripts dos quais você precisa do comportamento de saída / modificado - para reduzir a saída estranha, etc. ainda será ativado no script chamado. Não é uma proposta de tudo ou nada.
Não faz parte da sua pergunta, mas está relacionado:
Às vezes eu defino uma variável como
ou
e use-o (em várias instruções) como
ou, apenas para a segunda variação,
Depois, apenas comento a segunda definição quando quero que os comandos sejam executados. Você também pode usar esta técnica com um parâmetro ou variável exportada.
Com qualquer um desses itens, é necessário observar as instruções compostas, pois é garantido que o método funcione apenas na primeira instrução da lista composta.
fonte
Você pode pegar o PID do processo e, em seguida, examinar a tabela de processos com ps para ver quais eram os argumentos.
fonte
-x
foi definido dentro do script, não será mostrado naps
saída. E esta solução é ineficiente de qualquer maneira.set -o
solução que propus. Também deve funcionar para opções que não possuem um sinalizador associado como-x
.