Ich habe eine Datei mit einer Liste von Verzeichnissen. Zum Beispiel
/foo/bar/dir1
/foo/bar/dir2
/foo/bar/dir3
Ich möchte alle diese Verzeichnisse erstellen. Folgendes habe ich getan:
for dir in $(cat myfile); do mkdir $dir; done
Was wäre der richtige Weg, um den "nutzlosen Gebrauch von Katze" zu vermeiden?
Im Idealfall konzentrieren sich die Antworten auf Ksh88, aber ich interessiere mich auch für andere Shells
$ mkdir /foo/bar/dir{1,2,3}
oder$ mkdir /foo/bar/{dir1,dir2,dir3}
ksh
). Auf jeden Fall fand ich meine Antwort; Ich war nicht vertraut mitread
. Die Manpage erledigt den Rest.Antworten:
Der Vorschlag von AProgrammer zur Verwendung
xargs
ist häufig am besten. Eine andere Option ist die Verwendung der Umleitung in einewhile
Schleife, mit der zusätzliche Befehle und Variablen festgelegt werden können:Ein Beispiel für eine kompliziertere Struktur wäre:
Dies ist nicht möglich,
xargs
ohne ein "Hilfsprogramm" zu schreiben.quelle
xargs
overread
? Nach meinem Verständnisxargs
wird dies einen neuen Prozessread
auslösen (im Gegensatz zu einer eingebauten Shell). Wollen Sie das nicht vermeiden?xargs
auf einem einzigen Befehl betrieben werden, wenn Sie also (wie mehr als ein, eine eine Verbindung Erklärung haben wollenif
,while
oderfor
, etc.) oder eine variable Einstellung, dann können Sie nicht verwendenxargs
. Ja, xargs gibt eine neue Anweisung und eine für eine bestimmte Anzahl von Eingabezeilen frei, was sehr wenig Aufwand bedeutet. Einige ältere Versionen von verwendenxargs
jedoch keine-0
Option. Daher ist a derwhile read
richtige Weg, wenn die Namen der Eingabeverzeichnisse Leerzeichen enthalten.Ich würde so etwas tun
quelle
Zumindest in Bash, solange es keine Dateinamen gibt, die Leerzeichen und Zeilenumbrüche enthalten, gilt Folgendes:
funktioniert. Also haben wir einen nutzlosen Einsatz haben
for
,xargs
auch.<startet im Gegensatz zu Bash keinen neuen Prozess
cat
, aber ich weiß es nichtksh
.quelle
Dies ist die Lösung, die näher an Ihrem ursprünglichen Skript liegt und die nutzlose Katze vermeidet
Es enthält jedoch immer noch eine nutzlose Schleife.
quelle
Ich würde nicht sagen, dass das eine nutzlose Verwendung von Katze ist.
Im klassischen Sinne bedeutet ein UUOC Schreiben:
statt gleichwertig und billiger
oder (äquivalent und klassischer)
In diesem Fall:
Es gibt keinen Befehl, in den die Ausgabe von geleitet
cat
wird.Es gibt sicherlich Alternativen, die nicht verwendet werden
cat
. Insbesondere für bash und ksh$(<myfile)
ist es wahrscheinlich schneller als$(cat myfile)
, obwohl nicht alle Shells dieses Konstrukt unterstützen. Aber ich würde den ursprünglichen Code nicht mehr als "nutzlose Verwendung von Katze" bezeichnen, als ich die Lösung von AProgrammer als "nutzlose Verwendung von Xargs" bezeichnen würde.quelle
Mit
bash
4 und begrenzt durchARG_MAX
quelle
zmodload zsh/mapfile && mkdir -- ${(f)mapfile[infile]}
wenn die Shell istzsh