Befehl für bash exec erstellen

402
Nick Retallack

Ich habe ein Shell-Skript, das ausgeführt wird exec, um sich durch einen anderen Befehl zu ersetzen. Der andere Befehl benötigt einige optionale Argumente.

exec mycommand $ARG1 $ARG2 $ARG3 

Jedes dieser Argumente kann gefüllt werden oder nicht. Wenn sie nicht gefüllt sind, werden sie nicht als Argument für die Funktion gerendert. Zum Beispiel:

# if you have: ARG1=foo ARG3=bar exec mycommand $ARG1 $ARG2 $ARG3 # then you get: exec mycommand foo bar 

Ich möchte jedoch, dass Leerzeichen in den Werten für diese Argumente zulässig sind und dass dies nicht dazu führt, dass sie zusätzliche Argumente erzeugen. Das ist,

# if you have ARG1="foo bar baz" ARG2="qux" exec mycommand $ARG1 $ARG2 $ARG3 # then I want: exec mycommand "foo bar baz" qux # not: exec mycommand foo bar baz qux 

Ich habe versucht, Fluchtzitate in die Argumente einzufügen, aber der Exec erwartete, dass sie buchstäblich Teil des Wertes sein würden.

ARG1="\"foo bar baz\"" exec mycommand $ARG1 $ARG2 $ARG3 # gives you: exec mycommand \"foo bar baz\" 

Ich habe auch versucht, die Variablen in exec zu zitieren, aber dann wurden leere Zeichenfolgen übergeben, wenn keine Argumente vorhanden waren:

ARG2="foo bar" exec mycommand "$ARG1" "$ARG2" "$ARG3" # gives you: exec mycommand "" "foo bar" "" 

Gibt es eine bessere Möglichkeit, einen Befehl zu konstruieren und ihn an exec weiterzugeben? Gibt es eine andere Möglichkeit, den aktuellen Prozess durch einen anderen zu ersetzen?

1
http://mywiki.wooledge.org/BashFAQ/050 - So speichern Sie einen Befehl in einer Variablen. glenn jackman vor 8 Jahren 0

1 Antwort auf die Frage

1
glenn jackman

Mit Bash verwenden Sie ein Array und alle Variablen müssen korrekt in Anführungszeichen gesetzt werden:

ARG1="foo bar baz" ARG3="qux"  cmd=( mycmd )  [[ -n "$ARG1" ]] && cmd+=( "$ARG1" ) [[ -n "$ARG2" ]] && cmd+=( "$ARG2" ) [[ -n "$ARG3" ]] && cmd+=( "$ARG3" )  printf "%s\n" "$" #exec "$" 

Dadurch erhalten Sie den gewünschten Aufruf: exec mycommand "foo bar baz" qux ohne "leere Zeichenfolge". Entfernen Sie die printf-Zeile und kommentieren Sie die exec-Zeile ab, wenn Sie mit der Funktionsweise zufrieden sind.