Ausführen von Befehlen, die Leerzeichen in bash enthalten

7

Ich habe eine Datei namens cmd, die wie folgt eine Liste von Unix-Befehlen enthält:

%Vor%

Ich habe ein anderes Skript, das die Befehle in cmd wie folgt ausführt:

%Vor%

Das Problem besteht darin, dass Befehle in cmd ohne Leerzeichen ordnungsgemäß ausgeführt werden, solche mit Leerzeichen jedoch vom Skript nicht korrekt interpretiert werden. Folgendes ist die Ausgabe:

%Vor%

Was fehlt mir hier?

    
Epitaph 07.05.2009, 18:41
quelle

6 Antworten

13

Versuchen Sie, die eine Zeile in eval $cmds anstatt nur in $cmds

zu ändern     
Bryan Oakley 07.05.2009, 18:57
quelle
3

Sie können Ihr Skript durch den Befehl

ersetzen %Vor%

Die Aufgabe der Shell besteht darin, Befehle zu lesen und auszuführen! Wenn Sie Ausgabe- / Fortschrittsanzeigen möchten, führen Sie die Shell im ausführlichen Modus

aus %Vor%     
andrewdotn 08.05.2009 00:24
quelle
2

Mir persönlich gefällt diese Vorgehensweise besser - ich möchte die IFS nicht in die Irre führen, wenn ich das nicht tun muss. Sie müssen ein Eval verwenden, wenn Sie Pipes in Ihren Befehlen verwenden möchten. Die Pipe muss von der Shell und nicht vom Befehl verarbeitet werden. Ich glaube, die Shell analysiert die Pipes vor den expandierenden Strings.

Beachten Sie, dass ein Problem auftreten kann, wenn Ihre cmd-Datei Befehle enthält, die Eingaben erfordern. (Sie können jedoch immer ein neues fd für den Lesebefehl erstellen, aus dem gelesen werden soll.)

%Vor%     
jabbie 18.05.2009 16:55
quelle
1

Bearbeiten: Dies funktioniert bei Pipes und Umleitungen nicht. Danke, Andomar.

Sie müssen IFS zurück in die Schleife ändern, damit bash weiß, wo die Argumente aufgeteilt werden sollen:

%Vor%     
Ben Blank 07.05.2009 18:55
quelle
0

EDIT: Der Kommentar von Ben Blank wies darauf hin, dass meine alte Antwort falsch war, danke.

Sieht so aus, als würden Sie Befehle als einzelne Zeichenfolge ausführen, also sieht bash sie als den Namen der Prozedur / der Programmdatei an.

Eine Möglichkeit, dies zu vermeiden, wäre, bash auf dem Befehl aufzurufen. Änderung:

%Vor%

bis

%Vor%     
Andomar 07.05.2009 18:45
quelle
0
%Vor%

sed 'aXX' hängt XX an jede Zeile an. Dies funktioniert nicht für Multiline-Befehle wie:

%Vor%

aber für einzeilige Befehle sollte es in den meisten Fällen reichen.

    
user unknown 15.04.2010 15:21
quelle

Tags und Links