2011-09-08 8 views
6

próbuję uruchomić program tak:Jak zmusić bash/zsh do oceny parametrów, jak wiele argumentów po nałożeniu na komendzie

$CMD $ARGS 

gdzie $ ARGS jest zbiorem argumentów ze spacjami. Jednak wydaje się, że zsh przekazuje zawartość $ ARGS jako pojedynczy argument do pliku wykonywalnego. Oto konkretny przykład:

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

Czy istnieje flaga bash lub zsh, która kontroluje to zachowanie?

Należy pamiętać, że po umieszczeniu tego typu polecenia w skrypcie $!/Bin/sh działa on zgodnie z oczekiwaniami.

Dzięki,

setjmp

+0

Czy to nie oznacza, że ​​zsh nie jest zgodny z POSIX? – jpalecek

+0

@jpalecek Nie jest to wymagane, chyba że jest to wyraźnie wymagane (ustawiając niektóre opcje, wywołując je za pomocą symlinka '**/sh' ->'/bin/zsh' lub używając 'emulate sh' (który z kolei ustawia pewne opcje)). – ZyX

Odpowiedz

4

Będzie działać, jeśli używasz eval $CMD $ARGS.

7

Jeśli chcesz, aby zmienna łańcuchowa (są również tablice) została podzielona na słowa przed przekazaniem do polecenia, użyj $=VAR. Istnieje również opcja (shwordsplit, jeśli się nie mylę), która spowoduje, że dowolny command $VAR będzie działał jak command $=VAR, ale sugeruję, aby go nie ustawiać: używanie takich rzeczy jak command "$VAR" (zsh:) i command "${ARRAY[@]}" (zsh:) jest bardzo niewygodne. command $ARRAY).

5

W zsh jest to łatwe:

Zastosowanie cmd ${=ARGS} podzielić $ARGS na oddzielne argumenty po słowie (podzielonego na spacji).

Użyj cmd ${(f)ARGS}, aby podzielić $ARGS na osobne argumenty po linii (podzielone na znaki nowe, ale nie spacje/tabulatory).

Jak już wspomniano, ustawienie SH_WORD_SPLIT powoduje domyślnie dzielenie wyrazów, ale zanim zrobi się to w zsh, cf. http://zsh.sourceforge.net/FAQ/zshfaq03.html w celu wyjaśnienia, dlaczego podział na białe znaki nie jest domyślnie włączony.

Powiązane problemy