E 'possibile definire una macro-funzione nel bash così quando scrivo:definire una macro funzione simile in bash
F(sth);
bash gestisce questo:
echo "sth" > a.txt;
E 'possibile definire una macro-funzione nel bash così quando scrivo:definire una macro funzione simile in bash
F(sth);
bash gestisce questo:
echo "sth" > a.txt;
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.
F() {
echo "$1" > a.txt
}
È don usare le parentesi quando lo chiamate. Ecco come si chiamano:
F "text to save"
+1, bella risposta. ti dispiacerebbe spiegare in modo più dettagliato perché usi quel costrutto più complesso (ma migliore) per produrre l'argomento (i)? – Kaii
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
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