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!)
É 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"
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";)
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")
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
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.
Tags bash