Bash: testa se o script original foi executado com '-x'

7

É possível testar se um script bash foi executado com -x ?

Estou escrevendo um script que também executa alguns scripts remotos e gostaria de poder fazer algo como:

USE_X="$( run_with_x && "-x" || "" )"
ssh $host "bash $USE_X some_script.sh"
    
por David Wolever 03.10.2011 / 04:56

5 respostas

9

Basta olhar para a variável $- .

USE_X='case "$-" in *x*) echo "-x" ;; esac'

(Sim, eu consegui fazer isso sem invocar o grep. Salve os pids!)

    
por 03.10.2011 / 07:33
6

Provavelmente a maneira mais simples de analisar $- , semelhante ao método do dagbrown (também puro bash ) , mas sem usar case e backticks (subshell):

if  [[ ${-/x} != $- ]] ; then USE_X="-x"; fi

ou ainda mais curto:

[[ ${-/x} != $- ]] && USE_X="-x"

Note que [[ não é uma invocação do programa test builtin (como é o caso de [ ), mas uma construção de sintaxe bash (de acordo com man bash e esta recomendação dev ). Então eu afirmo que é "bash mais puro";)

    
por 03.10.2011 / 15:06
6

Esta expressão será verdadeira se o script for executado com -x , caso contrário, false: [[ $- =~ x ]] Portanto, esta expressão será "-x" se o script for executado com -x e "" (vazio), caso contrário: $([[ $- =~ x ]] && echo "-x")

    
por 22.09.2015 / 07:50
4

Depois de ler man pages e grepping para coisas, aqui está a solução:

$ cat show_x.sh
#!/bin/bash
if [ "$(set | grep xtrace)" ]; then
    echo "xtrace is on. :D"
else
    echo "xtrace is off. :("
fi

Resultado:

$ bash show_x.sh 
xtrace is off. :(

$ bash -x show_x.sh 
++ set
++ grep xtrace
+ '[' SHELLOPTS=braceexpand:hashall:interactive-comments:xtrace ']'
+ echo 'xtrace is on. :D'
xtrace is on. :D
    
por 03.10.2011 / 05:50
3

A página man bash documenta set -o xtrace como equivalente a set -x , que por sua vez é equivalente a dar -x como um argumento para o shell. (Até o momento, isso é compatível com SUSv3 sh, com a ressalva de que -o option é necessário "se o sistema suportar a opção Utilitários de portabilidade do usuário".)

Além disso, set -o sem uma opção imprime o status atual de todas as opções -o . (O SUSv3 também especifica isso, mas não é útil; o formato não é especificado; portanto, você só pode depender dele se souber que está executando um shell que usa um formato semelhante ao do bash.)

Portanto, o pipeline set -o | grep xtrace | grep -q on deve ser o que você está procurando.

    
por 03.10.2011 / 05:38

Tags