Rozwinięcie tyldy definiowane jest przez POSIX jako:
„Przedrostek tyldy” składa się z niecytowanego znaku <tilde> na początku słowa, po którym następują wszystkie znaki poprzedzające pierwszy bez cudzysłowu <slash> w słowie lub wszystkie znaki w słowie, jeśli nie ma < slash>. W przydziale można użyć wielu prefiksów tyldy: [...] po <znaku równości> przypisania, po każdym nie cytowanym <kolonie> lub obu. [...] Jeśli żaden z znaków w prefiksie tyldy nie jest cytowany, znaki w prefiksie tyldy po znaku <tyldy> są traktowane jako możliwa nazwa logowania z bazy danych użytkowników. [...] Jeśli nazwa logowania ma wartość NULL (to znaczy, że przedrostek tyldy zawiera tylko tyldę), przedrostek tyldy jest zastępowany wartością zmiennej HOME. Jeśli HOME jest wyłączone, wyniki nie są określone. [...]
Tak więc najkrótsza odpowiedź brzmi „ponieważ tak jest zdefiniowane”: zacytowanie dowolnego znaku w prefiksie, w tym znaku „ ~
,” wstrzymuje rozwinięcie.
Definiuje także rozwinięcie jako zawsze skutkujące pojedynczym słowem, więc cytowanie byłoby niepotrzebne:
Nazwę ścieżki wynikającą z rozwinięcia tyldy należy traktować tak, jakby była cytowana, aby zapobiec jej zmianie przez podział pola i rozwinięcie nazwy ścieżki.
Tam, gdzie niektóre ścieżki wymagają cytowania, a reszta to przedrostek tyldy, możesz od razu połączyć rozwinięcie tyldy i zwykłe cytowanie:
$ cat ~/"file name with spaces"
Mówiąc szerzej „dlaczego”: ponieważ nie można sobie wyobrazić dzielenia słów ~
, powinno to być zachowanie domyślne, zamiast wymagać cytowania. Ponieważ nie ma potrzeby cytowania, nadanie ~
specjalnego znaczenia w cudzysłowie byłoby niepotrzebną komplikacją. I oczywiście przyczyny historyczne oznaczają, że nie można go teraz zmienić, nawet jeśli byłoby to pożądane.