L'espansione della tilde è definita da POSIX come:
Un "prefisso tilde" è costituito da un carattere <tilde> non quotato all'inizio di una parola, seguito da tutti i caratteri che precedono il primo <slash> non quotato nella parola o da tutti i caratteri nella parola se non è presente < tagliare>. In un compito, è possibile utilizzare più prefissi tilde: [...] seguendo il <equals-sign> del compito, seguendo qualsiasi <colon> non quotato, o entrambi. [...] Se nessuno dei caratteri nel prefisso tilde viene citato, i caratteri nel prefisso tilde che segue <tilde> vengono trattati come un possibile nome di accesso dal database utente. [...] Se il nome di accesso è nullo (ovvero, il prefisso tilde contiene solo la tilde), il prefisso tilde viene sostituito dal valore della variabile HOME. Se HOME non è impostato, i risultati non sono specificati. [...]
Quindi la risposta più breve è "perché è definita in questo modo": la citazione di uno qualsiasi dei caratteri nel prefisso, incluso il ~
, elimina l'espansione.
Definisce inoltre l'espansione come sempre risultante in una sola parola, quindi la citazione non sarebbe necessaria:
Il nome del percorso risultante dall'espansione della tilde deve essere trattato come se fosse citato per evitare che venga alterato dalla divisione del campo e dall'espansione del nome del percorso.
Laddove parte del percorso richiede la quotazione, ma il resto è un prefisso tilde, è possibile combinare l'espansione tilde e la quotazione ordinaria in modo semplice:
$ cat ~/"file name with spaces"
Sul "perché" più ampio: dal momento che non è concepibile un uso per la suddivisione delle parole ~
, questo dovrebbe essere il comportamento predefinito, piuttosto che richiederne la citazione. Poiché non è necessario citarlo, dare ~
un significato speciale all'interno delle virgolette sarebbe una complicazione inutile. E, naturalmente, ragioni storiche significano che non potrebbe essere cambiato ora anche se fosse desiderabile.