Costruisci il comando per bash exec


1

Ho uno script di shell che viene eseguito exec per sostituirsi con un altro comando. L'altro comando accetta alcuni argomenti opzionali.

exec mycommand $ARG1 $ARG2 $ARG3

Qualcuno di questi argomenti potrebbe essere popolato o non popolato. Se non sono popolati, non vengono visualizzati come argomento per la funzione. Per esempio:

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

Tuttavia, voglio che gli spazi siano legali nei valori di questi argomenti, e per questo non li induca a produrre argomenti aggiuntivi. Questo è,

# 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

Ho provato a mettere le virgolette di escape negli argomenti, ma exec si aspettava che facessero letteralmente parte del valore.

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

Ho anche provato a citare le variabili in exec, ma poi ha iniziato a passare stringhe vuote quando gli argomenti non erano presenti:

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

C'è un modo migliore per costruire un comando e passarlo a exec? C'è un altro modo per sostituire il processo corrente con un altro?


mywiki.wooledge.org/BashFAQ/050 - come memorizzare un comando in una variabile.
glenn jackman

Risposte:


1

Con bash, si utilizza un array e tutte le variabili devono essere citate correttamente:

ARG1="foo bar baz"
ARG3="qux"

cmd=( mycmd )

[[ -n "$ARG1" ]] && cmd+=( "$ARG1" )
[[ -n "$ARG2" ]] && cmd+=( "$ARG2" )
[[ -n "$ARG3" ]] && cmd+=( "$ARG3" )

printf "%s\n" "${cmd[@]}"
#exec "${cmd[@]}"

Questo ti darà l'invocazione che desideri: exec mycommand "foo bar baz" qux senza argomenti "stringa vuota". Rimuovi la linea printf e decommenta la riga exec se sei soddisfatto di come funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.