web-dev-qa-db-fra.com

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

Par exemple, j'ai un simple fichier bash

#!/bin/bash
cd ~/hello
ls

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

90
Epeius
bash -x script

ou

set -x

dans le script.

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

114
Steven Parkes

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 "for" (par exemple) individuellement. Il fait écho aux commentaires, contrairement à -x.

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 l'accent sur les différences entre -v et -x. De plus, -v est identique à "-o verbose", mais ce dernier ne semble pas fonctionner dans le cadre d'un Shebang.

Cela devrait également fonctionner:

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

Cela devrait fonctionner:

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

set -o xtrace et set +o xtrace sont vos amis (c'est plus verbeux que -o verbose, et la sortie passe à STDERR, par opposition à verbose, qui semble se connecter à STDOUT).

Voir plus de conseils ici

4
pihentagy

Il y a plusieurs façons.

#!/usr/bin/env bash -x

comme la ligne Shebang.

Comprenant set -x dans le script lui-même activera la fonctionnalité tandis que set +x le désactivera. Ces deux méthodes fonctionneront également avec le shell sh plus portable.

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

3
user6784

va comme

language -x script

langue = python, Perl, bash -x = opérateur script = nom de fichier

j'espère que cela aide.

1
debuggerpk

#! /bin/bash -x fait ce que vous voulez.

0
Rory