Zgodnie z tą odpowiedzią i moim własnym zrozumieniem tylda rozwija się do katalogu domowego:
$ echo ~
/home/braiam
Teraz, ilekroć chcę, aby rozszerzenie powłoki działało, tzn. Używa takich nazw zmiennych $FOO
i nie łamie z powodu nieoczekiwanych znaków, takich spacji itp., Należy użyć podwójnych cudzysłowów "
:
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
Dlaczego to rozszerzenie nie działa z tyldą?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
--path ~/myfile
rozwija się, ale--path=~/myfile
nie zmienia.Odpowiedzi:
Powodem, ponieważ w podwójnych cudzysłowach tylda
~
nie ma specjalnego znaczenia, jest traktowana jako dosłowna.POSIX definiuje cudzysłowy jako:
Z wyjątkiem $, `, \i @, inne znaki są traktowane jako dosłowne wewnątrz cudzysłowach.
źródło
$HOME
.~
, na przykładls -l ~/"My Documents"
Rozwinięcie tyldy definiowane jest przez POSIX jako:
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:
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:
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.źródło
""
.~
powstaje w powłoce C na długo przed dodaniem jej do powłoki Korna, a następnie dodaniem do specyfikacji powłoki POSIX.W powłoce C
~
znajdował się operator globowania (rozwinięty przez tę samą procedurę jak*.txt
na przykład ta rozwijająca się ), więc podobnie jak reszta globowania nie była wykonywana wewnątrz podwójnych cudzysłowów.źródło
Chociaż nie odpowiada to na pytanie, dlaczego jest tak zaprojektowany,
$HOME
zamiast tego używasz go, jeśli musisz go zastąpić, ponieważ tak właśnie~
działa.źródło
~otheruser
~otheruser
pokazuje, jak złym pomysłem było traktować~
inaczej niż zmienne i inne rzeczy, które są rozwinięte w podwójnych cudzysłowach.