tutorial - shell script example




In einem Shell-Skript: echo Shell-Befehle, wie sie ausgeführt werden (10)

Wie wiederhole ich in einem Shell-Skript alle aufgerufenen Shell-Befehle und erweitere alle Variablennamen? Zum Beispiel in Anbetracht der folgenden Zeile:

ls $DIRNAME

Ich möchte, dass das Skript den Befehl ausführt und Folgendes anzeigt

ls /full/path/to/some/dir

Der Zweck besteht darin, ein Protokoll aller aufgerufenen Shell-Befehle und ihrer Argumente zu speichern. Vielleicht gibt es eine bessere Möglichkeit, ein solches Protokoll zu erstellen?


Die Antwort von shuckc für das Echo von ausgewählten Zeilen hat ein paar Nachteile: Am Ende wird der folgende Befehl set +x ausgegeben, und Sie verlieren die Möglichkeit, den Exit-Code mit $? zu testen $? da es von der set +x überschrieben wird.

Eine weitere Möglichkeit ist, den Befehl in einer Subshell auszuführen:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

Das gibt Ihnen die Ausgabe wie folgt:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

Dies verursacht jedoch den Aufwand, eine neue Subshell für den Befehl zu erstellen.


Eine andere Möglichkeit ist, "-x" an die Spitze des Skripts anstatt an die Befehlszeile zu setzen:

$ cat ./server
#!/bin/bash -x
ssh [email protected]

$ ./server
+ ssh [email protected]
[email protected]'s password: ^C
$

(Unzureichender Vertreter, um die gewählte Antwort zu kommentieren.)


Für zsh echo

 setopt VERBOSE

und zum Debuggen

 setopt XTRACE

Geben Sie "bash -x" in der Befehlszeile vor dem Namen des Bash-Skripts ein. Um beispielsweise foo.sh auszuführen, geben Sie Folgendes ein:

bash -x foo.sh

Jemand der oben gepostet hat:

#!/bin/bash
#function to display commands
exe() { echo "\$ [email protected]" ; "[email protected]" ; }

und das sieht vielversprechend aus, aber ich kann nicht für das Leben von mir herausfinden, was es tut. Ich habe in der Mann-Bash-Seite nach "\ $" und "$ @" gegoogelt und gesucht, und absolut nichts gefunden .

Ich verstehe, dass eine Funktion erstellt wird, namens "exec ()". Ich verstehe, dass die geschweiften Klammern den Anfang und das Ende der Funktion markieren. Ich denke, ich verstehe, dass das Semikolon eine "harte Rückkehr" zwischen einem mehrzeiligen Befehl markiert, so dass "{echo" \ $ $ @ "; "$ @"; } wird im Wesentlichen:

{
echo "\$ [email protected]"
"[email protected]"

}

Kann mir jemand eine kurze Erklärung geben, oder wo finde ich diese Info, da mein Google-Fu offensichtlich versagt?

(Ohne eine neue Frage zu einem alten Thread zu starten, ist es mein Ziel, die Ausgabe in eine Datei umzulenken. Die Methode "set -x; [commands]; set + x" würde für mich angemessen funktionieren, aber ich kann ' Ich finde heraus, wie man die Ergebnisse in einer Datei anstatt auf dem Bildschirm widerspiegelt, also versuchte ich, diese andere Methode zu verstehen, in der Hoffnung, dass ich mich sehr schlecht mit Umleitung / pipes / tee / etc auskennen könnte.)

Vielen Dank!

SPÄTER BEARBEITEN:

Mit etwas Basteln glaube ich, dass ich es herausgefunden habe. Hier ist mein entsprechender Code für das, was ich brauche:

SCRIPT_LOG="\home\buddy\logfile.txt"
exe () {
  params="[email protected]"                       # Put all of the command-line into "params"
  printf "%s\t$params" "$(date)" >> "$SCRIPT_LOG"   # Print the command to the log file
  $params                           # Execute the command
}

exe rm -rf /Library/LaunchAgents/offendingfile
exe rm -rf /Library/LaunchAgents/secondoffendingfile

Die Ergebnisse in der Datei logfile.txt sehen ungefähr so ​​aus:

Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/offendingfile
Tue Jun  7 16:59:57 CDT 2016  rm -rf /Library/LaunchAgents/secondoffendingfile

Genau das, was ich brauchte. Vielen Dank!


Laut TLDP Bash Guide für Anfänger: Kapitel 2. Schreiben und Debuggen von Skripten

2.3.1. Debugging für das gesamte Skript

$ bash -x script1.sh

...

Es gibt jetzt einen vollwertigen Debugger für Bash, verfügbar bei SourceForge . Diese Debugging-Funktionen sind in den meisten modernen Versionen von Bash ab 3.x verfügbar.

2.3.2. Debugging auf Teile des Skripts

set -x            # activate debugging from here
w
set +x            # stop debugging from here

...

Tabelle 2-1. Übersicht über die Debugging-Optionen für das Set

Short  | Long notation | Result  
-------+---------------+--------------------------------------------------------------
set -f | set -o noglob | Disable file name generation using metacharacters (globbing).  
set -v | set -o verbose| Prints shell input lines as they are read.  
set -x | set -o xtrace | Print command traces before executing command.  

...

Alternativ können diese Modi im Skript selbst angegeben werden, indem der Shell-Deklaration der ersten Zeile die gewünschten Optionen hinzugefügt werden. Optionen können kombiniert werden, wie es normalerweise bei UNIX-Befehlen der Fall ist:

#!/bin/bash -xv

Sie können ein Bash-Skript im Debug-Modus mit der Option -x ausführen .
Dies wird alle Befehle wiedergeben.

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt


Sie können die Option -x auch im Skript speichern . Gib einfach die Option -x im Shebang an.

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt




Um zu ermöglichen, dass zusammengesetzte Befehle wiederholt werden, verwende ich eval plus Soths exe Funktion, um zu echo, dann führe den Befehl aus. Dies ist nützlich für Piped-Befehle, die sonst nur keinen oder nur den Anfangsteil des Piped-Befehls anzeigen würden.

Ohne Bewertung:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe ls -F | grep *.txt

Ausgänge:

$
file.txt

Mit eval:

exe() { echo "\$ [email protected]" ; "[email protected]" ; }
exe eval 'ls -F | grep *.txt'

Welche Ausgänge?

$ exe eval 'ls -F | grep *.txt'
file.txt

set -x wird Ihnen geben, was Sie wollen.

Hier ist ein Beispiel für ein Shell-Skript, das Folgendes demonstriert:

#!/bin/bash
set -x #echo on

ls $PWD

Dies erweitert alle Variablen und gibt die vollständigen Befehle vor der Ausgabe des Befehls aus.

Ausgabe:

+ ls /home/user/
file1.txt file2.txt

$ cat exampleScript.sh
#!/bin/bash
name="karthik";
echo $name;

bash -x exampleScript.sh

Die Ausgabe ist wie folgt:





shell