2016-06-02 38 views
0

Ich versuche, mehrere Beschreibungen zu Dateien mit den Namen 1, 2, 3, usw. in bash zu erstellen.
Zum Beispiel exec 9>abc/1 funktioniert ganz gut, aber wenn ich versuche, Deskriptoren in einer for-Schleife zu erstellen, wie folgt: exec $[$i+8]>abc/$i, funktioniert es nicht. Ich habe viele verschiedene Möglichkeiten ausprobiert, aber es scheint, dass exec einfach keine Variablen akzeptiert. Gibt es eine Möglichkeit zu tun, was ich will?Bash: Erstellen vieler Deskriptoren in einer Schleife

EDIT: Wenn nicht, gibt es vielleicht eine Möglichkeit flock ohne Deskriptoren zu verwenden?

+0

In einem anderen Hinweis ist '$ [Ausdruck]' veraltete Syntax. Bitte gehen Sie zu '$ ((Ausdruck))' – anishsane

+1

Versuchen Sie 'eval" exec $ ((i + 8))> abc/$ i "' – anishsane

Antwort

0

Ja, exec akzeptiert keine Variablen für Datei-Deskriptor-Nummern. Wie in den Kommentaren darauf hingewiesen, können Sie

eval "exec $((i + 8))>"'"abc/$i"' 

, die, wenn $i1 ist, zu

entspricht
exec 9>"abc/$i" 

Diese komplexen Zitate, die eval-ed gewährleisten und dann Befehl exec-ed sicher auch wenn der Dateiname zu einem anderen als abc/1 geändert wird.

Aberthere is eine Warnung:

Umleitungen Datei größer als 9-Deskriptoren sollten mit Vorsicht verwendet werden, da sie mit Datei in Konflikt geraten können Deskriptoren die Shell intern verwendet.

Wenn also Ihre Aufgabe, nicht fortlaufende Datei Deskriptornummern benötigen, können Sie automatisch zugeordnet Deskriptoren verwenden:

Jede Umleitung, die von einer Dateideskriptor Nummer versehen sein kann stattdessen durch ein Wort vorangestellt werden der Form {varname}. In diesem Fall weist die Shell für jeden Umleitungsoperator außer >&- und <&- einen Dateideskriptor von mehr als 10 zu und weist ihn varname zu.

So

exec {fd}>"abc/$i" 
echo "$fd" 

wird Dateideskriptor 10 (oder höher) öffnen abc/1 und Drucken zu schreiben, die Dateideskriptor Nummer (z.B. 10).