W skrypcie powłoki, w jaki sposób mogę wywołać echo wszystkich wywoływanych poleceń powłoki i rozwinąć nazwy zmiennych?
Na przykład, biorąc pod uwagę następujący wiersz:
ls $DIRNAME
Chciałbym, aby skrypt uruchomił polecenie i wyświetlił następujące informacje
ls /full/path/to/some/dir
Celem jest zapisanie dziennika wszystkich wywoływanych poleceń powłoki i ich argumentów. Czy jest może lepszy sposób na wygenerowanie takiego dziennika?
set -x
da ci to, czego chcesz.Oto przykładowy skrypt powłoki do zademonstrowania:
Rozwija wszystkie zmienne i wypisuje pełne polecenia przed wyjściem polecenia.
Wynik:
źródło
set -o verbose
lubset -v
(tylko „pełne”) lubset -o xtrace
lubset -x
(tylko „xtrace”) lubset -xv
(oba) lubset -o xtrace -o verbose
(oba).Korzystam z funkcji, aby wywołać echo i uruchomić polecenie:
Które wyjścia
W przypadku bardziej skomplikowanych potoków poleceń, możesz użyć eval:
Które wyjścia
źródło
++ set +x
wyjścia, gdy jest wyłączony, a także wygląda bardziej czysto. Jednak w przypadku pojedynczej instrukcji lub dwóch odpowiedź bhassel przy użyciu podpowłoki jest najwygodniejsza.set +x
, wpływa to na wszystkie polecenia, co jest zbyt wiele!cp "foo bar" baz
icp foo "bar baz"
. Jest więc dobry do wyświetlania użytkownikowi informacji o postępach; w mniejszym stopniu do debugowania danych wyjściowych lub nagrywania powtarzalnych poleceń. Różne przypadki użycia. Wzsh
, można zachować cytowanie z:q
modyfikatora:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
z twojego polecenia. Więc nie oczekuj, że będzie działać poprawnieexe eval "echo 'eval world'"
!Możesz także przełączać to dla wybranych linii w skrypcie, zawijając je
set -x
iset +x
na przykładźródło
Odpowiedź shuckc na echo wybranych linii ma kilka wad: kończy się także
set +x
echo następującej komendy i tracisz możliwość testowania kodu wyjścia,$?
ponieważ zostaje on nadpisany przezset +x
.Inną opcją jest uruchomienie polecenia w podpowłoce:
co da ci wynik jak:
Powoduje to jednak obciążenie związane z tworzeniem nowej podpowłoki dla polecenia.
źródło
++ set +x
wyjścia.if [ $? -eq 0 ]
zif (set -x; COMMAND)
.Inną opcją jest umieszczenie „-x” na górze skryptu zamiast w wierszu poleceń:
źródło
./myScript
ibash myScript
. Wciąż warto zwrócić uwagę, dzięki.Według tldp „s Bash Przewodnik dla początkujących: Rozdział 2. Pisanie skryptów i debugowania :
źródło
Wpisz „bash -x” w wierszu poleceń przed nazwą skryptu Bash. Na przykład, aby uruchomić foo.sh, wpisz:
źródło
Możesz wykonać skrypt Bash w trybie debugowania z
-x
opcją .Spowoduje to echo wszystkich poleceń.
Możesz także zapisać opcję -x w skrypcie . Po prostu określ
-x
opcję w shebang.źródło
bash -vx
zrobi to samo, ale bez zmiennej interpolacjiDla Zsh, echo
I do debugowania
źródło
Dla
csh
itcsh
, możeszset verbose
lubset echo
(lub możesz nawet ustawić oba, ale może to prowadzić do pewnego powielania przez większość czasu).Ta
verbose
opcja drukuje prawie dokładnie to, co wpisujesz.Ta
echo
opcja bardziej wskazuje na to, co zostanie wykonane przez spawnowanie.http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
źródło
Dane wyjściowe są następujące:
źródło
Aby umożliwić echo poleceń złożonych, używam funkcji
eval
plus Sotha, aby wywołaćexe
echo i uruchomić polecenie. Jest to przydatne w przypadku poleceń potokowych, które w innym przypadku nie pokazałyby tylko żadnej lub tylko początkowej części polecenia potokowego.Bez oceny:
Wyjścia:
Z eval:
Które wyjścia
źródło