Como fazer com que os scripts bash imprimam todos os comandos antes de serem executados?

88

Por exemplo, eu tenho um arquivo bash simples

#!/bin/bash
cd ~/hello
ls

Como posso exibir todos os comandos antes de executá-lo? Exatamente o efeito oposto de "@echo off" nos scripts em lotes do Windows.

Epeius
fonte
1
Para quem procura quais setsão as opções, você pode encontrá-las nesta página de manual .
Mkobit 16/10/2015
Você pode simplesmente estender shebang como esta#!/bin/bash -x
sobi3ch

Respostas:

110
bash -x script

ou

set -x

no script.

Você pode desativar a opção novamente com set +x. Se você quiser apenas fazer alguns comandos, use um subshell: `(set -x; command1; command; ...;)

Steven Parkes
fonte
Eu sempre usei isso com grande efeito. A saída parece um pouco mais suja do que você poderia esperar primeiro.
Scott Pacote
2
Ao definir, PS4você pode ajustar o prompt de -x. Por exemplo: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( datevai retardá-lo, embora)
Walter Tross
23

Estes também funcionam:

set -v

ou

#!/bin/bash -v

Mas -v não imprime a sequência PS4 antes de cada linha de script e não rastreia as etapas de uma instrução "for" (por exemplo) individualmente. Ele faz eco dos comentários enquanto -x não.

Aqui está um exemplo da saída usando -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Aqui está o resultado do mesmo script com -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

Observe que eu incluí "echo -n" para adicionar ênfase às diferenças entre -v e -x. Além disso, -v é o mesmo que "-o verbose", mas o último parece não funcionar como parte de um shebang.

Dennis Williamson
fonte
Ótima explicação! sem fazer nenhuma pesquisa, parece-me que Verbose e eXplicit são o que essas duas letras representam.
Ape-inago
Eu acho que -x está mais perto do eXecute.
Steven Parkes
10

Isso também deve funcionar:

#!/bin/bash -x
cd ~/hello
ls
tomoe
fonte
6

Isso deve funcionar:

set -o verbose #echo on
...
set +o verbose #echo off
splattne
fonte
4

set -o xtracee set +o xtracesão seus amigos (é mais detalhado do que -o verbosee a saída é para STDERR, em vez de detalhado, que parece registrar-se em STDOUT).

Veja mais dicas aqui

pihentagy
fonte
3

Existem algumas maneiras.

#!/usr/bin/env bash -x

como a linha shebang.

A inclusão set -xno próprio script habilitará a funcionalidade enquanto set +xa desabilitará. Ambos os métodos também funcionarão com o sh shell mais portátil.

Se bem me lembro, o perl também tem a opção -x.

user6784
fonte
1

vai como

language -x script

idioma = python, perl, bash -x = script do operador = nome do arquivo

espero que ajude.

debuggerpk
fonte
3
-xnão tem nada a com ecoando em Python
Eugene Pankov
0

#! /bin/bash -x faz o que você quer.

Rory
fonte