Ho sempre pensato che bash trattasse le barre rovesciate allo stesso modo quando si usa senza o con virgolette doppie, ma mi sbagliavo:
[[email protected] ~]$ echo "foo \ "
foo \
[[email protected] ~]$ echo foo \ # Space after \
foo
Quindi ho pensato che le barre rovesciate fossero sempre stampate, quando si usano le virgolette doppie, ma:
[[email protected] ~]$ echo "foo \" "
foo "
[[email protected] ~]$ echo "foo \\ "
foo \
Perché viene mostrata la barra rovesciata nella prima riga di codice?
Risposta accettata:
La sezione 3.1.2.3 Double Quotes del manuale di GNU Bash dice:
La barra rovesciata conserva il suo significato speciale solo se seguita da uno dei
seguenti caratteri:'$ ', '` ', '" ', '\ ', o newline . Tra virgolette doppie, le barre rovesciate seguite da uno
di questi caratteri vengono rimosse. Le barre inverse che precedono i caratteri
senza un significato speciale non vengono modificate. Una doppia virgoletta può essere
tra virgolette facendola precedere da una barra rovesciata. Se
abilitato, l'espansione della cronologia verrà eseguita a meno che non venga visualizzato un "! ' che appare
tra virgolette viene evitato utilizzando una barra rovesciata. La barra rovesciata che precede
'! ' non viene rimosso.
Quindi \ tra virgolette viene trattata in modo diverso sia da \ tra virgolette singole e \ virgolette esterne. Viene trattato alla lettera, tranne quando è in grado di far sì che un carattere venga trattato alla lettera che potrebbe altrimenti avere un significato speciale tra virgolette.
Nota che sequenze come \' , \? e \* vengono trattati alla lettera e la barra rovesciata non viene rimossa, perché ' , ? e * non hanno già un significato speciale se racchiusi tra virgolette.