2016-04-20 8 views
1

stolperte ich heute über das folgende Problem in zsh 5.1.1 (vereinfachtes Beispiel):Zsh: Verhalten von Zargs mit leerer Liste - ist das ein Fehler oder eine Funktion?

#!/bin/zsh 
autoload -U zargs 
zargs -- my*files(N) -- rm -v 

Das funktionierte gut, bis eines Tages, gab es keine Dateien meine Muster entsprechen. Wegen der (N), wandte sich der Befehl in

zargs -- -- rm -v 

ich erwartet hatte, dass in diesem Fall rm würde nicht aufgerufen werden, in ähnlicher vergeblich wo xargs den Befehl nicht aufrufen, wenn die imput leer. Allerdings wurde rm einmal aufgerufen, ohne Argumente, was dann dazu führte, dass eine Fehlermeldung geschrieben wurde.

der Tat können wir sehen, dass

zargs -- -- echo xxx 

auch echo einmal aufruft.

Die Dokumentation von zargs in der Manpage ist in dieser Hinsicht nicht wirklich klar, aber ich denke, dass ohne Argumente der Befehl überhaupt nicht aufgerufen werden sollte.

Haben wir einen Fehler, oder soll zargs wirklich auf diese Weise funktionieren?

Antwort

1

zargs funktioniert auf diese Weise ähnlich wie GNU xargs heute (ugh ...).

Wir könnten die -r, --no-run-if-empty Option verwenden. zargs erbt dieses Angebot von GNU xargs, von zargs --help:

-r, --no-run-if-empty  if there are no arguments, then do not run COMMAND; 
          if this option is not given, COMMAND will be 
          run at least once 

xargs GNU hat diese Funktion:

-r, --no-run-if-leer
Wenn der Standard Eingabe enthält keine Nicht-Leerzeichen, führen Sie nicht den Befehl aus. Normalerweise wird der Befehl einmal ausgeführt, auch wenn keine Eingabe erfolgt. Diese Option ist eine GNU-Erweiterung.
- xargs.1 nroff source

(? Un) glücklicherweise, FreeBSD und NetBSD's haben die Zähler-Funktion wie folgt aus:

-r
Kompatibilität mit GNU xargs. Die GNU-Version von xargs führt das Dienstprogrammargument mindestens einmal aus, auch wenn die xargs-Eingabe leer ist, und unterstützt die Option -r, um dieses Verhalten zu verhindern. Die FreeBSD Version von Xargs führt nicht das Dienstprogramm Argument auf leere Eingabe, aber es unterstützt die Option -r für die Befehlszeilenkompatibilität mit GNU xargs, aber die Option -r tut nichts in der FreeBSD Version von Xargs.
- FreeBSD xargs(1)