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.

Epeius
la source
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; ...;)

Steven Parkes
la source
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.

Dennis Williamson
la source
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
Tomoe
la source
6

Cela devrait fonctionner:

set -o verbose #echo on
...
set +o verbose #echo off
éclabousser
la source
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

pihentagy
la source
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.

utilisateur6784
la source
1

va comme

language -x script

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

J'espère que ça aide.

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

#! /bin/bash -x fait ce que tu veux.

Rory
la source