2012-04-17 17 views

risposta

14

Non è possibile eseguire la sintassi arbitraria. Le parentesi sono metacaratteri che hanno un significato speciale per il parser, quindi non è possibile utilizzarle come validi nomi. Il modo migliore per estendere la shell è definire le funzioni.

Questa sarebbe una base echo wrapper che scrive sempre lo stesso file:

f() { 
    echo "[email protected]" 
} >a.txt 

Questo fa circa lo stesso, ma gestisce inoltre stdin - sacrificando echo's-e e -n opzioni:

f() { 
    [[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}" 
} >a.txt 

Che può essere chiamato come

f arg1 arg2... 

o

f <file 

funzioni vengono passati argomenti nello stesso modo come altri comandi.

Il secondo wrapper eco-like dapprima prova uno set first argument o uno stdin proveniente da un non-tty e chiama condizionatamente printf utilizzando i parametri posizionali se impostato o stdin. L'espressione test evita il caso di entrambi gli argomenti zero e nessun reindirizzamento da un file, nel qual caso Bash proverebbe ad espandere l'output del terminale, appendendo la shell.

+0

+1, bella risposta. ti dispiacerebbe spiegare in modo più dettagliato perché usi quel costrutto più complesso (ma migliore) per produrre l'argomento (i)? – Kaii

+0

Permette solo l'input da stdin o argomenti. L'espressione test impedisce una situazione in cui sono presenti sia zero args che lo stdin proviene da un terminale, nel qual caso la shell dovrebbe essere uccisa poiché i processi di proprietà di tty vengono letti e bloccati. Se ciò accade, i parametri posizionali verranno espansi se impostati, o l'espansione verrà letta dall'input della funzione. Una soluzione leggermente più portatile ma più lenta è possibile con 'cat' - questo richiede un sistema con real/dev/fd/*. Ho appena postato questo trucco poiché la mia risposta precedente era la stessa di quella degli altri. :) – ormaaj

+0

inoltre, consente * più argomenti * proprio come fa 'echo'. La tua funzione funziona con 'f one two three' mentre gli altri funzionano solo con' f "one two three" '. Dato un input senza qotes, le altre soluzioni prenderebbero solo la prima parola (qui: "una") in considerazione. – Kaii

4
F() { 
    echo "$1" > a.txt 
} 

È don usare le parentesi quando lo chiamate. Ecco come si chiamano:

F "text to save" 
3

Sì, solo si dovrebbe chiamare con F sth:

F() 
{ 
    echo "$1" > a.txt 
} 

Read more here.

Problemi correlati