Perché sh -c 'echo -n 1' è diverso da bash -c 'echo -n 1'

1

Sono su Mac Book Air, OSX 10.8.

Sto cercando di capire perché questi due frammenti non stampano lo stesso risultato. sh -c 'echo -n 1' uscite -n 1 mentre bash -c 'echo -n 1' output 1 come previsto.

Potresti aiutarmi a spiegare perché e come farli produrre lo stesso (se possibile)?

    
posta Flevour 17.10.2012 - 09:34
fonte

2 risposte

3

Perché apparentemente Mac OS è uno dei sistemi che risponde all'opzione xpg_echo quando viene eseguita in modalità POSIX. Eseguire bash come / bin / sh equivale all'esecuzione con --posix o con l'impostazione POSIXLY_CORRECT.

La soluzione è di smettere di usare echo tranne nei casi in cui non ci può essere ambiguità. printf è la sostituzione portatile. Non utilizzare mai i flag di opzione da echo, (e usa printf se lo fai).

Esistono più implementazioni storiche incompatibili di echo che interrompono la sua specifica in un modo che non può essere corretto e pertanto le flag di opzione non sono portabili. Non sono a conoscenza di qualcosa che attualmente implementa correttamente POSIX echo .

shopt -u xpg_echo dovrebbe modificare questo comportamento. Inoltre, come hai già scoperto, non in esecuzione in modalità POSIX.

Potresti anche voler aggiornare ... bash 3 sta diventando un po 'croccante. Molti bug sono stati corretti da allora.

    
risposta data 17.10.2012 - 10:26
fonte
1

/bin/sh è in realtà una versione di bash che si avvia in modalità POSIX ( bash --posix ) e ha anche altre modifiche. Un'altra differenza è che interpreta le sequenze di escape per impostazione predefinita:

$ bash -c "echo 'a\ba'"
a\ba
$ sh -c "echo 'a\ba'"
a
$ sh -c "shopt -u xpg_echo; echo 'a\ba'"
a\ba
$ bash --posix -c "echo 'a\ba'"
a\ba

printf %s funzionerebbe allo stesso modo nella maggior parte degli ambienti.

Potresti anche scrivere script per bash. OS X's sh non ti impedisce di usare Bashisms che potrebbe non funzionare con /bin/sh su altre piattaforme, come dash su Ubuntu .

Vedi anche questa domanda e la sezione su eco su < a href="http://www.etalabs.net/sh_tricks.html"> questo sito web .

    
risposta data 17.10.2012 - 11:40
fonte

Leggi altre domande sui tag