2012-07-17 7 views
12

Attualmente sto scrivendo un framework di test bash, che richiede di essere il più portabile possibile.Cos'è più portatile? echo -e o usando printf?

Quindi, a un certo punto, ho dovuto stampare una nuova riga iniziale seguita da un testo che contiene diverse variabili espanse. Questa è la soluzione che ho usato.

echo -e "\n$number_of_specs ${units}, $number_of_specs_failed failed" 

Questo sembra a posto ma non sono sicuro di come portatile che viene confrontato con la stampa la linea utilizzando per esempio printf?

Eventuali idee o suggerimenti in cui sono stati trovati riferimenti?

+3

Con 'portatile' , intendi portabile tra varie shell (che significa non bash) o tra varie versioni di bash? –

+1

Non è chiaro come un framework di test di bash debba essere compatibile con qualsiasi cosa che non sia bash. Immagino che il tuo punto sia che alcuni SO non hanno printf, e in quanto tale non fa davvero parte di bash, ma fornisce incompatibilit? Hai esaminato i costi di compatibilità del lavoro nell'implementazione di autoconf e ./configure? Perché non solo alcuni test in alto, 'if [[! -f/bin/printf]]; echo -e "per favore avere printf installato prima di eseguire il resto di questo script"; fi '?? In bocca al lupo. – shellter

+2

Credo che 'printf' sia tecnicamente ancora più portabile perché il comportamento predefinito' xpg_echo' può variare tra le piattaforme anche all'interno di Bash (quindi è possibile impostarlo esplicitamente se lo si desidera realmente.) – ormaaj

risposta

20

printf è più portatile. Dovrebbe sempre essere preferito su echo -e. Se il targeting di bash/zsh/ksh in particolare, echo $'...' è anche ok. Se il targeting di zsh o ksh è specifico, print è ok.

POSIX (ultimo link) discute anche echo -n problemi, che dovrebbe anche essere evitati. In sostanza, non usare mai le opzioni per echo, e per la portabilità, l'uso printf.)

+2

+1 buona risposta. – jordanm

1

Il più portatile (in termini di portabilità a sistemi antichi senza printf) soluzione per i principali ritorni a capo è ovviamente

echo 
echo "$number_of_specs ${units}, $number_of_specs_failed failed"