2012-11-06 3 views
11

Molto simile to this question.echo "-n" non stampa -n?

Sto iterando attraverso alcune cose con uno script automatico in BASH. Occasionalmente lo script incontrerà "-n" e echo tenterà di interpretarlo.

Ha tentato questa:

$ POSIXLY_CORRECT=1 /bin/echo -n 

e

$ POSIXLY_CORRECT=1 /bin/echo "-n" 

Ma interpretato l'argomento ogni volta.

Quindi questo, che funziona ma è possibile colpire caratteri di escape nelle stringhe, motivo per cui non voglio applicare un carattere nullo a tutti gli input e usare -e.

$ echo -e "\x00-n" 
-n 

printf è possibile, ma è da evitare a meno che non ci sono altre opzioni (non tutte le macchine hanno printf come un programma di utilità).

$printf "%s" "-n" 
-n 

Quindi c'è un modo per ottenere echo per stampare "-n"?

+1

E la domanda è? – choroba

+0

Il mio male, lasciato nel titolo. Aggiunto all'ultima riga. – MrDoom

+0

Tangenzialmente correlati, http://everything2.com/title/The+UNIX+and+the+Echo – tripleee

risposta

8

printf dovrebbe essere un built-in in tutte le shell, a meno che alcune delle vostre macchine abbiano versioni di shell molto vecchie. È stato integrato nel bash per un lungo periodo. Probabilmente è più portatile di echo -e.

Altrimenti, non c'è davvero alcun modo di ottenere le opzioni echo a cui importa.

Modificare: da an answer a un'altra domanda simile; evitare citando problemi con printf utilizzando questo pratico non-diritti digitali distribuiti avvolgitore:

ech-o() { printf "%s\n" "$*"; } 

(Ecco ech-o, come in "senza opzioni")

+1

printf è molto più portatile di echo, ma assicurati di passare la stringa che desideri stampare come argomento, * non * come stringa di formato (cioè 'printf"% s \ n "" $ stringtoprint "' invece di 'printf" $ stringtoprint \ n "') - vedi la risposta di @ djhaskin987. –

+0

@GordonDavisson: ho aggiunto egotisticamente una nota da una mia risposta diversa, che ritengo sia una buona soluzione. – rici

+3

Hah! +1 per un uso appropriato di '" $ * "' –

2

Se si richiama Bash con il nome sh , simulerà lo sh, dove l'opzione -n non era disponibile per echo. Non sono sicuro se questo soddisfi le tue esigenze.

$ /bin/sh -c 'echo -n' 
+0

Che '-n' non è specificato nella specifica del comando della shell POSIX.2 è completamente falso. Il comportamento dell'opzione (non stringa) per '-n' è specificato come parte del comportamento standard di riferimento (non-XSI) per' echo'; sono solo le shell che implementano le estensioni XSI facoltative dove non è presente. Vedi http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html - ora, concesso, _your_ '/ bin/sh' potrebbe seguire XSI, ma questo non è universalmente garantito. –

4

cosa circa anteponendo la stringa con un carattere ("x" per esempio) che viene rimosso on-the-fly con un taglio:

echo "x-n" | cut -c 2- 
3

echo "-n" indica alla shell di metti '-n' come primo argomento di echo, carattere per carattere. Semanticamente, echo "-n" corrisponde a echo -n. Prova a modificare (si tratta di uno standard POSIX e dovrebbe funzionare su qualsiasi shell):

printf '%s\n' "-n" 
1

echo "-n" non stampa -n perché -n viene interpretato come opzione per echo (vedi help echo).Ma è possibile utilizzare: il metodo

echo -e "\055n" 
+0

Questo è supportato dall'implementazione GNU di 'echo', ma non con qualsiasi versione conforme a POSIX - un'implementazione POSIX conforme a XSI di' echo' stamperebbe il letterale '-e', e uno non-XSI non lo farebbe interpreta il '\ 055'. Infatti, se esporti POSIXLY_CORRECT = 1' su un sistema GNU, vedrai il precedente comportamento. –

0

Cheating:

echo -e "\r-n" 
+0

... che funziona se l'output è destinato al consumo umano, ma non se deve essere letto da un programma o da un altro utente non terminale. –