Comment faire en sorte que les scripts bash impriment chaque commande avant son exécution?


88

Par exemple, j'ai un fichier bash simple

#!/bin/bash
cd ~/hello
ls

Comment puis-je lui faire afficher chaque commande avant de l'exécuter? Tout l'effet opposé de "@echo off" dans les scripts batch de Windows.


1
Pour ceux qui recherchent les setoptions, vous pouvez les trouver sur cette page de manuel .
mkobit

Vous pouvez simplement prolonger shebang comme ceci#!/bin/bash -x
sobi3ch

Réponses:


110
bash -x script

ou

set -x

dans le script.

Vous pouvez redéfinir l'option avec set +x. Si vous voulez juste le faire pour quelques commandes, vous pouvez utiliser un sous-shell: `(set -x; command1; command; ...;)


J'ai toujours utilisé cela à bon escient. La sortie a l'air un peu plus sale que ce à quoi vous vous attendiez.
Scott Pack

2
En définissant, PS4vous pouvez modifier l'invite de -x. Exemple: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( datecela ralentira cependant)
Walter Tross

23

Ceux-ci fonctionnent également:

set -v

ou

#!/bin/bash -v

Mais -v n'imprime pas la chaîne PS4 avant chaque ligne de script et ne trace pas les étapes d'une instruction "pour" (par exemple) individuellement. Il fait écho aux commentaires alors que -x ne le fait pas.

Voici un exemple de sortie utilisant -v:

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

echo hello
hello

Voici le résultat du même script avec -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

Notez que j'ai inclus "echo -n" pour mettre en évidence les différences entre -v et -x. En outre, -v est identique à "-o verbose", mais ce dernier ne semble pas fonctionner dans le cadre d'un shebang.


Grande explication! sans faire de recherches, il me semble que Verbose et eXplicit sont ce que ces deux lettres représentent.
Ape-inago

Je pense que -x est plus proche d'eXecute.
Steven Parkes

10

Cela devrait également fonctionner:

#!/bin/bash -x
cd ~/hello
ls

6

Cela devrait fonctionner:

set -o verbose #echo on
...
set +o verbose #echo off

4

set -o xtraceet set +o xtracesont vos amis (plus verbeux que -o verbose, et la sortie passe à STDERR, par opposition à verbose, qui semble se connecter à STDOUT).

Voir plus de conseils ici


3

Il y a plusieurs façons.

#!/usr/bin/env bash -x

comme la ligne shebang.

L'inclusion set -xdans le script lui-même activera la fonctionnalité tout set +xen la désactivant. Ces deux méthodes fonctionneront également avec le shell sh plus portable.

Si je me souviens bien, Perl a aussi l'option -x.


1

va comme

language -x script

language = python, perl, bash -x = script d'opérateur = nom de fichier

J'espère que ça aide.


3
-xn’a rien à faire avec un écho en Python
Eugene Pankov

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.