2017-01-22 2 views
1

Ziemlich einfach, ich habe eine echo Anweisung in meiner Shell (Bash) -Skript, das ich an eine externe Datei als Protokollierungsmethode umleiten möchte. Das Skript wird stündlich von der Crontab des Root-Benutzers ausgeführt (über sudo crontab -e).Wie leite ich die Ausgabe des Befehls echo im Bash-Skript in das Verzeichnis des Skripts um?

Ich möchte diese Protokolldatei im selben Verzeichnis wie das Skript befinden.

Mein erster Versuch war,

echo "$(date) | blah blah" >> "$(pwd)/script.log" 

Dies ist jedoch eindeutig nicht als das Arbeitsverzeichnis des root crontab funktioniert (/root/) ist nicht das gleiche wie das Verzeichnis des Skripts. So ein paar Ratschläge im Anschluss an SO habe ich stattdessen

script_dir=$(dirname $0) 
echo "$(date) | blah blah" >> "$(script_dir)/script.log" 

Diesmal für Gründe, warum ich noch nicht verstehen, wird die Protokolldatei unter / gespeichert, wie in /script.log.

Logischerweise würde man annehmen, dass die Variable script_dir zu einem leeren String ausgewertet wurde und so wurde "$(script_dir)/script.log" als "/script.log" ausgewertet.

Aber als Test, habe ich ein einfaches Testskript geschrieben,

echo "$(dirname $0)" 

und lief es von /. Sicher genug, bekomme ich eine richtige nicht leere Ausgabe: /home/pi/scripts/testscripts/dirname.sh (wo das Testskript ich schrieb, residiert).

Also, was ist das Geschäft, und wie bekomme ich das zum Funktionieren?


p.s. bash --version sagt, dass ich derzeit GNU bash bin mit der Version 4.3.30 (1) -release

+1

BTW, was ist deine Absicht, 'echo" $ (date) | blah blah "' zu machen, was für mich keinen Sinn ergibt. – Inian

+1

@Inian Mein Skript startet meinen Raspberry Pi mit 'shutdown -r now' neu, wenn die Internetverbindung unterbrochen wird, was ich durch einen Blick auf den Exit-Code eines' ping'-Befehls in einem 'if'-Zustand festlege. Ich möchte ein Protokoll haben, wenn das passiert. Die volle 'echo'-Anweisung ist eigentlich '' $ (Datum + "% d% b% r") | $ (uptime -p) | Exit $ {code}. Neustart ... "'. – ning

+1

fair genug! Prost! – Inian

Antwort

2

Sie müssen die geschweiften Klammern in Anführungszeichen Variablen in bash, so etwas wie,

echo "$(date) | blah blah" >> "${script_dir}/script.log" 

erweitern Shell Parameter Expansion

Das '$' Zeichen führt Parametererweiterung, Befehlsersatz oder arithmetische Erweiterung ein.

Die grundlegende Form der Parametererweiterung ist $ {parameter}. Der Wert des Parameters ist substituiert. Die geschweiften Klammern werden benötigt, wenn der Parameter ein Positionsparameter mit mehr als einer Ziffer ist oder wenn auf einen Parameter folgt, der nicht als Teil seines Namens interpretiert werden soll.


More on Parameter expansion

${PARAMETER} 

Die einfachste Form ist, einfach den Namen eines Parameters verwenden in Klammern. Dies ist identisch mit der Verwendung von $FOO, wie Sie es überall sehen, hat aber den Vorteil, dass sofort Zeichen folgen können, die andernfalls als Teil des Parameternamens interpretiert würden.Vergleichen Sie diese beiden Ausdrücke (WORD = „Auto“ zum Beispiel), wo wir ein Wort mit einem Hinter „s“ drucken möchten:

echo "The plural of $WORD is most likely $WORDs" 
echo "The plural of $WORD is most likely ${WORD}s" 

Warum die erste scheitern? Es druckt nichts, weil ein Parameter (Variable) namens "WORDs" nicht definiert ist und daher als "" (nichts) gedruckt wird. Ohne Klammern für die Parametererweiterung zu verwenden, interpretiert Bash die Sequenz aller gültigen Zeichen vom einführenden "$" bis zum letzten gültigen Zeichen als Name des Parameters. Wenn Sie geschweifte Klammern verwenden, zwingen Sie Bash nur dazu, den Namen innerhalb Ihrer geschweiften Klammern zu interpretieren.

1

Diese Linie hat einen Fehler:

echo "$(date) | blah blah" >> "$script_dir/script.log" 

Die "$(script_dir)" Syntax auszuführen versucht, einen Befehl script_dir benannt und erfassen ihre Ausgabe als Wert in der Zeichenfolge zu verwenden:

echo "$(date) | blah blah" >> "$(script_dir)/script.log" 

Es sollte . Was Sie brauchen, ist eine einfache variable Erweiterung, $script_dir, die einfach den Wert einer Variablen namens script_dir extrahiert.

Verwandte Themen