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.