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.
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; ...;)
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
Cela devrait fonctionner:
set -o verbose #echo on
...
set +o verbose #echo off
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
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.
va comme
language -x script
langue = python, Perl, bash -x = opérateur script = nom de fichier
j'espère que cela aide.
#! /bin/bash -x
fait ce que vous voulez.