Dieser Befehl erzeugt, wenn er alleine ausgeführt wird, das erwartete Ergebnis (die letzte Zeile der Crontab):
tail -n 1 /etc/crontab
Wenn ich es jedoch als Teil eines Echo-Befehls ausführe, um das Ergebnis an eine Datei zu senden, wird eine Zusammenfassung aller Dateien im Arbeitsverzeichnis sowie das erwartete Ergebnis hinzugefügt:
sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file'
Warum hat dieser Befehl die zusätzlichen Daten erzeugt?
echo
macht das hier für dich? Bedenken Sie auchtail -n 1 /etc/crontab | sudo tee /path/to/file >/dev/null
echo $(stuff)
?Antworten:
Ihre Crontab-Linie enthält ein oder mehrere Sternchen
*
, die "jederzeit" anzeigen. Wenn diese Zeile durch die Befehlsersetzung ersetzt wird, ist das Ergebnis ungefähr soWährend die meisten weiteren Erweiterungen nicht auf die Ausgabe der Befehlssubstitution angewendet werden, lautet die Pfadnamenerweiterung (ebenso wie die Feldaufteilung) :
Die Pfadnamenerweiterung wird
*.txt
zu einer Liste übereinstimmender Dateinamen (Globbing), in der*
alles übereinstimmt. Das Endergebnis ist, dass Sie jeden (nicht versteckten) Dateinamen im Arbeitsverzeichnis erhalten, der für jeden*
in Ihrer Crontab-Zeile aufgeführt ist.Sie können dies beheben, indem Sie die Erweiterung zitieren, wenn der von Ihnen veröffentlichte Code für einen komplexeren Befehl repräsentativ ist:
aber einfacher verlieren Sie einfach das
echo
ganz:Dies sollte tun, was Sie wollen, und es ist auch einfacher (der einzige andere wesentliche Unterschied besteht darin, dass in dieser Version die Feldaufteilung weggelassen wird, die sonst aufgetreten wäre, sodass Leerzeichen nicht reduziert werden).
quelle
tail -n -1 /etc/crontab | sudo tee /path/to/file
ist die Redewendung, die ich als am wenigsten fehleranfällig empfunden habe, wenn ich Ausgaben in Dateien umleitete, die Superuser-Berechtigungen erfordern.Betrachten wir ein Verzeichnis mit diesen Dateien:
Lassen Sie uns nun den Befehl tail ausführen:
Das Obige ist die letzte Zeile von
crontab
und das ist, was wir erwarten. Jedoch:Doppelte Anführungszeichen beseitigen dieses Problem:
Ohne die doppelten Anführungszeichen wird das Ergebnis der Befehlsersetzung durch die Shell erweitert. Eine der Erweiterungen ist die Pfadnamenerweiterung . Im obigen Fall bedeutet dies, dass
f*
es so erweitert wird, dass es mit jedem Dateinamen übereinstimmt, der mit beginntf
.Wenn Sie nicht ausdrücklich Shell-Erweiterungen wünschen, setzen Sie alle Shell-Variablen und / oder Befehlsersetzungen in doppelte Anführungszeichen.
quelle
Der Globing-Shell-Mechanismus wird
*
auf die lokale Datei erweitert.crontab line hat wahrscheinlich einen
*
Platzhalter für jeden.zB diese Linie in Crontab läuft am Sonntag um 7.47 Uhr, erster Stern bedeutet jeden Tag, zweiter jeden Monat.
dann Sie
tail
und Ausgabedas wird
*
zu lokaler Datei erweitert.quelle