2016-06-08 6 views
0

Hier ist, was ich bisher:Printing bash-Befehle in eine Logdatei, wie sie ausführen

LOGFILE="/home/bubba/bubba.log" 

# Function to echo commands to log file as they are executed 
exe() { 
    params = [email protected] #Put command-line into "params" 
    printf "%s\%t\%s\n" "$params" >> $LOGFILE #Print date, a tab, and command to run 
    $params #Run the command-line 
} #End of exe() function 

exe rm -rf /usr/Library/bubbasfile.txt 
exe rm -rf /usr/Library/bubbas add-ons/ 

Der erste Aufruf von exe, die keine Leerzeichen enthält, funktioniert, wie ich es erwarten würde, zu arbeiten. Der zweite Aufruf von exe, der ein Leerzeichen im Pfad enthält, funktioniert nicht.

Ich habe versucht, doppelte Anführungszeichen um diese und um diese und um die andere Sache und um alles herum zu setzen; Ich habe einen Backslash-Escape-Zeichen vor dem Leerzeichen versucht; Ich habe einen doppelten Backslash vor dem Space versucht. Einige dieser Permutationen führen dazu, dass die richtige Zeile in die Protokolldatei gedruckt wird, aber das Verzeichnis mit dem Leerzeichen wird nie gelöscht.

Hilfe?

Danke!

+1

Bitte werfen Sie einen Blick: http://www.shellcheck.net/ – Cyrus

+1

Kennen Sie 'script '? –

Antwort

1

Kurze Antwort: siehe BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!.

Lange Antwort: Wenn Sie die Argumente in params speichern, verlieren Sie die Unterscheidung zwischen Leerzeichen innerhalb von Argumenten vs. Wortumbrüche zwischen Argumenten. Lösung: Verwenden Sie stattdessen ein Array und beziehen Sie sich dann darauf unter Verwendung des Idioms "${arrayname[@]}" (doppelte Anführungszeichen sind kritisch!), Die jedes Element des Arrays in ein einzelnes "Wort" konvertieren, selbst wenn es Leerzeichen enthält. Es ist auch ein wenig schwierig, die Argumente eindeutig zu drucken, aber printf's %q Format kann es tun.

Hier ist meine vorgeschlagene Rewrite (mit einigen anderen Bereinigungen, wie Plätze rund um das = entfernen):

# Function to echo commands to log file as they are executed 
exe() { 
    params=("[email protected]") # Put command-line into "params" as an array 
    printf "%s\t%q" "$(date)" "${params[0]}" >> "$LOGFILE" # Print date, a tab, and the command name... 
    printf " %q" "${params[@]:1}" >> "$LOGFILE" # then the arguments (with quotes/escapes as needed and spaces between) 
    printf "\n" >> "$LOGFILE" 
    "${params[@]}" #Run the command-line 
} # End of exe() function 
+0

Super! Ich verstehe das noch nicht, aber ich prüfe es. (Ich bekomme auch nicht die Ergebnisse, die ich erwarte (kein Newline in der Log-Datei zwischen den Befehlen), aber das liegt vielleicht an einem Tippfehler in meinem Code kopieren, ich werde daran arbeiten. Ja, mein Code-Snippet oben hatte ein paar Tippfehler, die nicht in meinem wirklichen Code sind (wie die Leerzeichen und die zusätzlichen% s), aber ich schätze es sehr, dass ich sie repariere, es hilft mir als grüner Bash-Coder, einige der Konzepte zu verfestigen bash coding Und ich schätze Ihre allgemeine Antwort! Danke! – DebianFanatic

+0

Also, wenn die Argumente gesendet werden, sagen Sie "rm file1 file2 mit Leerzeichen file3", sagen Sie die $ @ Variable (die ich abgeschlossen habe bedeutet "Die ganze Befehlszeile", obwohl Google nicht überprüft, dass für mich) den Unterschied zwischen den Argumenten im Vergleich zum Raum innerhalb eines Arguments kennt, aber dass, wenn es in meine eigene Variable "params" eingegeben wird, diese Unterscheidung verloren ist? – DebianFanatic

+0

Oh, kein extra "% s" in meinem Original-Snippet, aber ein fehlendes "$ (date)". Wow, Fehler sind einfach ... ;-) – DebianFanatic