Jak sprawić, by skrypty bash drukowały każde polecenie przed jego wykonaniem?

88

Na przykład mam prosty plik bash

#!/bin/bash
cd ~/hello
ls

Jak ustawić wyświetlanie wszystkich poleceń przed ich wykonaniem? Przeciwny efekt „@echo off” w skryptach wsadowych Windows.

Epejusz
źródło
1
Dla tych, którzy szukają setopcji, możesz je znaleźć na tej stronie podręcznika .
mkobit
Możesz po prostu przedłużyć #!/bin/bash -x
shebang w

Odpowiedzi:

110
bash -x script

lub

set -x

w skrypcie.

Możesz ponownie ustawić opcję za pomocą set +x. Jeśli chcesz to zrobić tylko dla kilku poleceń, możesz użyć podpowłoki: `(set -x; command1; command; ...;)

Steven Parkes
źródło
Zawsze korzystałem z tego z wielkim skutkiem. Wyjście wygląda na nieco bardziej brudne, niż można się było spodziewać.
Scott Pack
2
Ustawiając PS4możesz dostosować podpowiedź -x. Np .: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( datespowolni to)
Walter Tross
23

Te działają również:

set -v

lub

#!/bin/bash -v

Ale -v nie drukuje łańcucha PS4 przed każdą linią skryptu i nie śledzi indywidualnie kroków instrukcji „for” (na przykład). Odsyła komentarze, podczas gdy -x nie.

Oto przykład danych wyjściowych przy użyciu -v:

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

echo hello
hello

Oto wynik tego samego skryptu z opcją -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

Zauważ, że dodałem „echo -n”, aby podkreślić różnice między opcjami -v i -x. Ponadto, -v jest tym samym, co „-o gadatliwy”, ale ten ostatni wydaje się nie działać jako część shebang.

Dennis Williamson
źródło
Świetne wyjaśnienie! bez przeprowadzania badań wydaje mi się, że te dwie litery oznaczają Verbose i eXplicit.
Ape-inago
Myślę, że -x jest bliższy eXecute.
Steven Parkes,
10

Powinno to również działać:

#!/bin/bash -x
cd ~/hello
ls
tomoe
źródło
6

To powinno działać:

set -o verbose #echo on
...
set +o verbose #echo off
splattne
źródło
4

set -o xtracei set +o xtracesą twoimi przyjaciółmi (jest bardziej gadatliwy niż -o verbose, a dane wyjściowe trafiają do STDERR, w przeciwieństwie do pełnych, które wydają się logować do STDOUT).

Zobacz więcej wskazówek tutaj

pihentagy
źródło
3

Jest kilka sposobów.

#!/usr/bin/env bash -x

jako linia shebang.

Dołączenie set -xdo samego skryptu włączy tę funkcję, a jednocześnie set +xją wyłączy. Obie te metody będą również działać z bardziej przenośną powłoką sh.

Jeśli dobrze pamiętam, perl ma również opcję -x.

użytkownik6784
źródło
1

idzie jak

language -x script

język = python, perl, bash -x = operator script = nazwa pliku

mam nadzieję, że to pomoże.

debuggerpk
źródło
3
-xnie ma nic wspólnego z odbijaniem echa w Pythonie
Eugene Pankov
0

#! /bin/bash -x robi co chcesz.

Rory
źródło