
Ich suche nach einer eleganten, plattformübergreifenden Möglichkeit, die Namen von Dateien in umzuleiten entr
. Ich weiß, dass das Folgende mit Bash funktioniert, aber ich hätte gerne einen Befehl, der in anderen Shells funktioniert.
( entr
ist ein Programm, das Dateien überwacht und beim Start und bei Änderungen dieser Dateien einen Befehl ausführt. In der Dokumentation wird ls *.ext
beispielsweise angegeben, dass es über eine Pipe an das Programm weitergeleitet wird. Es erwartet also eine durch Zeilenumbrüche getrennte Liste gültiger Dateinamen, die an das Programm weitergeleitet werden. Bei falschen Dateinamen wird eine Warnung ausgegeben.)
Mehrzeiler
Mit diesem Befehl kann ich bestimmte Dateien mit einem mehrzeiligen Herestring auflisten:
$ entr echo "command ran" <<< "
> filename1
> filename2
> "
Ich finde die Anführungszeichen und die Notwendigkeit, sie in separaten Zeilen aufzulisten, nervig. Eine schnelle Suche zeigt auch, dass es in anderen Shells als Bash möglicherweise nicht funktioniert.
Ich könnte interaktiv verwenden cat
:
$ cat | entr echo "command ran"
filename2
filename2
aber ich muss jedes Mal eine neue Zeile einfügen, es gibt nicht viel Spielraum für Fehler, und ich muss Ctrl-Dam Ende sorgfältig eingeben.
Ein Heredoc funktioniert ähnlich, beinhaltet jedoch eine Bookend-Syntax.
$ cat << EOF | entr echo "command ran"
> filename1
> filename2
> EOF
Einzeiler:
Ich könnte auch Folgendes tun ls
, was auf den ersten Blick gut aussieht:
$ ls filename1 filename2 | entr echo "command ran"
Aber es ls
würde falsch geschriebene Namen entfernen, während es entr
bei falschen Namen eine Validierung durchführt und davor warnt, und ich mache mir Sorgen über die Nebenwirkungen, die ein solcher Aufruf von ls mit sich bringt.
Ich könnte echo
und weiterleiten an, tr
bevor ich weiterleite an entr
:
$ echo filename1 filename2 | tr " " "\n" | entr echo "command ran"
Aber mir gefallen die ganzen zusätzlichen Befehle nicht.
Die Frage:
Wie schreibe ich einen kurzen, eleganten Befehl, der in den meisten (vorzugsweise allen) Shells funktioniert? Die von POSIX erwartete Syntax wäre ideal.
Antwort1
Da entr
jede Datei in einer separaten Zeile erscheinen soll, sind Sie ziemlich eingeschränkt.habenum jeden Dateinamen in einer separaten Zeile zu haben. Jeder Versuch, daraus eine einzelne Zeile zu machen (z. B. Ihr tr
Beispiel), schlägt fehl, wenn das Trennzeichen Teil eines Dateinamens ist („dies ist ein Dateiname“).
Ich würde einfach das Einfache machen
echo 'filename 1
filename2' | entr echo "command ran"