Ich versuche, die Anzahl der Dateien in meinem /tmp/
Verzeichnis zu überwachen . Dafür dachte ich, dass dieser Befehl funktionieren würde:
watch sh -c 'ls /tmp/|wc -l'
Aber es scheint zu funktionieren, als ob ls
es keine Argumente gäbe . Ich bin nämlich dabei ~
und erhalte stattdessen die Anzahl der Dateien /tmp/
. Ich habe eine Problemumgehung gefunden, die zu funktionieren scheint:
watch sh -c 'ls\ /tmp/|wc -l'
Aber warum muss ich dem Raum zwischen ls
und entfliehen /tmp/
? Wie wird der Befehl von transformiert, watch
sodass die ls
Ausgabe an geleitet wc
, aber /tmp/
nicht als Argument an übergeben wird ls
?
watch "sh -c 'ls /tmp | wc -l'"
Das Ausführen dieses Befehls sollte den gewünschten Effekt erzielen. Dies ist kein Uhrenfehler, versuchensh -c ls /tmp
Sie es und Sie erhalten Ihr Home-Verzeichnis (aber ich habe keine Ahnung warum ...)watch
falsch. Der Befehl, an den Sie übergeben werden,watch
wird wiederumwatch
an weitergeleitetsh -c
, sodass Sie tatsächlichsh -c
zweimal vorgehen ./tmp
ist ein Argument dafürsh
, in diesem Fall kein Argument dafürls
.Antworten:
Der Unterschied ist ersichtlich über
strace
:Im backquote-Fall
ls /tmp
wird als einziges Argument das-c
to übergebensh
, das wie erwartet abläuft. Ohne diese Backquote ist der Befehl anstelle Wort Split , wennwatch
läuft ,sh
was wiederum die mitgelieferte läuftsh
, so dass nur nochls
als Argument übergeben wird-c
, was bedeutet , dass das Sub-Subsh
nur einen nackten läuftls
Befehl, und listet den Inhalt des aktuellen Arbeits Verzeichnis.Warum also die Komplikation von
sh -c ...
? Warum nicht einfach rennenwatch 'ls /tmp|wc -l'
?quelle
strace
.ls /tmp
ist ...“ und „Ohne diese Backquote , der Befehl ist ...“, und Anwendungenbq
undnobq
als Dateinamen, wenn die ganze Zeit auf den Bezug Backslash in Ihremls\ /tmp
Befehl.Es gibt zwei Hauptkategorien von
watch
Befehlen (von denen, die Befehle in regelmäßigen Abständen ausführen sollen,watch
kein Standardbefehl sind, es gibt sogar Systeme, in denenwatch
etwas völlig anderes ausgeführt wird, wie das Aufspüren einer anderen tty-Zeile unter FreeBSD).Eine, die bereits die Verkettung ihrer Argumente mit Leerzeichen an eine Shell übergibt (dies führt tatsächlich einen Aufruf durch
sh -c <concatenation-of-arguments>
), und eine, die nur den mit den angegebenen Argumenten angegebenen Befehl ausführt, ohne eine Shell aufzurufen.Du bist in der ersten Situation, also brauchst du nur:
Wenn Sie das tun:
Ihr
watch
läuft tatsächlich:Und
sh -c ls /tmp/
führt dasls
Inline-Skript aus, in dem sich$0
befindet/tmp/
(wird alsols
ohne Argumente ausgeführt und listet das aktuelle Verzeichnis auf).Einige der
watch
Implementierungen in der ersten Kategorie (wie die von procps-ng unter Linux) akzeptieren eine-x
Option, mit der sie sich wie diewatch
der zweiten Kategorie verhalten . Mit there können Sie also Folgendes tun:quelle