Em um script de shell, como ecoar todos os comandos de shell chamados e expandir qualquer nome de variável?
Por exemplo, dada a seguinte linha:
ls $DIRNAME
Gostaria que o script execute o comando e exiba o seguinte
ls /full/path/to/some/dir
O objetivo é salvar um log de todos os comandos do shell chamados e seus argumentos. Existe talvez uma maneira melhor de gerar esse log?
set -x
vai te dar o que você quer.Aqui está um exemplo de script de shell para demonstrar:
Isso expande todas as variáveis e imprime os comandos completos antes da saída do comando.
Resultado:
fonte
set -o verbose
ouset -v
(apenas "detalhado") ouset -o xtrace
ouset -x
(apenas "xtrace") ouset -xv
(ambos) ouset -o xtrace -o verbose
(ambos).Eu uso uma função para ecoar e executar o comando:
Quais saídas
Para comandos mais complicados, etc., você pode usar eval:
Quais saídas
fonte
++ set +x
saída quando desligado, além de parecer mais limpo. Porém, para apenas uma ou duas afirmações, a resposta de bhassel usando um subshell é a mais conveniente.set +x
, isso afeta todos os comandos, o que é demais!cp "foo bar" baz
ecp foo "bar baz"
, por exemplo. Portanto, é bom para exibir informações de progresso para um usuário; menos para depuração de saída ou gravação de comandos reproduzíveis. Casos de uso diferentes. Emzsh
, você pode preservar a citação com o:q
modificador:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
do seu comando. Portanto, não espere que funcione corretamenteexe eval "echo 'eval world'"
!Você também pode alternar isso para linhas selecionadas em seu script, envolvendo-as
set -x
eset +x
, por exemplo,fonte
A resposta do shuckc para repetir as linhas de seleção tem algumas desvantagens: você também termina com o seguinte
set +x
comando e perde a capacidade de testar o código de saída, uma$?
vez que ele é sobrescrito peloset +x
.Outra opção é executar o comando em um subshell:
que lhe dará uma saída como:
No entanto, isso implica a sobrecarga de criação de um novo subshell para o comando.
fonte
++ set +x
saída.if [ $? -eq 0 ]
porif (set -x; COMMAND)
.Outra opção é colocar "-x" na parte superior do seu script, em vez de na linha de comando:
fonte
./myScript
ebash myScript
. Ainda é bom ressaltar, obrigado.De acordo com o Guia Bash do TLDP para iniciantes: Capítulo 2. Escrevendo e depurando scripts :
fonte
Digite "bash -x" na linha de comando antes do nome do script Bash. Por exemplo, para executar foo.sh, digite:
fonte
Você pode executar um script Bash no modo de depuração com a
-x
opção .Isso ecoará todos os comandos.
Você também pode salvar a opção -x no script . Basta especificar a
-x
opção no shebang.fonte
bash -vx
fará o mesmo, mas sem interpolação de variávelPara zsh, eco
E para depuração,
fonte
Para
csh
etcsh
, você podeset verbose
ouset echo
(ou pode até definir os dois, mas pode resultar em duplicação na maioria das vezes).o
verbose
opção imprime praticamente a expressão exata do shell que você digita.A
echo
opção é mais indicativa do que será executado através da desova.http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
fonte
A saída é a seguinte:
fonte
Para permitir que comandos compostos sejam ecoados, eu uso
eval
aexe
função plus Soth para fazer eco e executar o comando. Isso é útil para comandos canalizados que, de outra forma, mostrariam apenas nenhum ou apenas a parte inicial do comando canalizado.Sem avaliação:
Saídas:
Com eval:
Quais saídas
fonte