2011-09-08 8 views
6

Sto cercando di eseguire un programma come questo:Come forzare bash/zsh per valutare parametri come più argomenti quando applicato ad un comando

$CMD $ARGS 

dove $ ARG è un insieme di argomenti con gli spazi. Tuttavia, sembra che zsh distribuisca il contenuto di $ ARGS come singolo argomento per l'eseguibile. Ecco un esempio specifico:

$export ARGS="localhost -p22" 
$ssh $ARGS 
ssh: Could not resolve hostname localhost -p22: Name or service not known 

C'è un flag bash o zsh che controlla questo comportamento?

Si noti che quando inserisco questo tipo di comando in uno script $!/Bin/sh, esso si comporta come previsto.

Grazie,

setjmp

+0

Non significa che zsh non è conforme a POSIX? – jpalecek

+0

@jpalecek A meno che non sia esplicitamente richiesto (impostando alcune opzioni, chiamandolo usando il link simbolico '**/sh' ->'/bin/zsh' o usando 'emulate sh' (che a sua volta imposta solo alcune opzioni)). – ZyX

risposta

4

Funzionerà se si utilizza eval $CMD $ARGS.

7

Se si desidera che una variabile stringa (ci siano anche matrici) sia divisa in parole prima di passare a un comando, utilizzare $=VAR. C'è anche un'opzione (shwordsplit se non mi sto sbagliando) che renderà qualsiasi command $VAR come command $=VAR, ma ti suggerisco di non impostarlo: trovo molto scomodo digitare cose come command "$VAR" (zsh: command $VAR) e command "${ARRAY[@]}" (zsh: command $ARRAY).

5

In zsh è facile:

Usa cmd ${=ARGS} di dividere $ARGS in argomenti separati per parola (per parti separate su spazi bianchi).

Utilizzare cmd ${(f)ARGS} per dividere $ARGS in argomenti separati per riga (divisi su nuove righe ma non spazi/tabulazioni).

Come altri hanno già menzionato, l'impostazione di SH_WORD_SPLIT rende la suddivisione delle parole per default, ma prima di farlo in zsh, cf. http://zsh.sourceforge.net/FAQ/zshfaq03.html per una spiegazione del motivo per cui la divisione degli spazi bianchi non è abilitata per impostazione predefinita.

Problemi correlati