Piszę swój pierwszy skrypt, więc jestem pewien, że jest to podstawowe pytanie, ale czy ktoś mógłby mi wyjaśnić, dlaczego:
cd ~
cd bin
cd ~/bin
cd 'bin'
Ale nie
cd '~'
cd '~/bin'
Muszę przejść cd
do ścieżki katalogu ze spacją w jednej z nazw katalogów, więc potrzebuję cudzysłowów (to Windows Program Files
pod winem). Mogę obejść to za pomocą dwóch cd
poleceń, ale dlaczego nie mogę wstawiać ~
cudzysłowów?
Po wpisaniu cd '~'
(lub cd "~"
) otrzymam:
bash: cd: ~: No such file or directory
command-line
bash
B.Tanner
źródło
źródło
cd
katalog o nazwie~
?cd
. Użycie zmiennych do przechowywania ścieżek nie chcesz wpisywać wiele razy, na przykładpf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
/
lubNUL
?cd ./~
Odpowiedzi:
Jak zauważył @karel w swojej odpowiedzi,
~
jest znakiem specjalnym i został rozszerzony przez Basha do katalogu domowego bieżącego użytkownika. Zobacz instrukcję Basha dotyczącą „Rozszerzenia tyldy” lub wyszukaj nagłówek „Rozszerzenia tyldy” na stronie podręcznika (man bash
).Jakikolwiek cytat wokół
~
zapobiega temu rozszerzeniu tyldy.Aby odpowiedzieć na pytanie, w jaki sposób nadal można go używać do
cd
katalogu ze spacjami w jego nazwie, istnieje kilka alternatyw:Zamiast tego pomiń cytaty i użyj spacji ułamkowych:
Cytuj resztę ścieżki, ale pomiń je wokół tyld i pierwszego ukośnika:
Jak widzisz, możesz łączyć cytowane i niecytowane ciągi w Bash, po prostu pisząc je obok siebie, bez odstępów między nimi.
Użyj zmiennej środowiskowej
$HOME
zamiast tyldy, która wciąż jest rozwijana w „podwójnych cudzysłowach” (ale nie „pojedynczych cudzysłowach”):źródło
~'/...'
nie będzie działać i nie jest tym, co ma ta odpowiedź.~/'...'
lub~/"..."
zadziała.~/'path'
jest droga.~'/...'
działać? Ukośnik nie jest znakiem specjalnym, więc wydaje się, że powinien działać zarówno wewnątrz, jak i poza cytatami.~ jest znakiem specjalnym, który jest interpretowany przez powłokę jako katalog domowy zalogowanego użytkownika. „~” jest interpretowane przez powłokę jako dosłowny znak ~, a nie jako katalog domowy zalogowanego użytkownika, ponieważ umieszczenie ciągu wewnątrz dwóch pojedynczych znaków cudzysłowu powoduje, że ciąg ten jest interpretowany jako dosłowny ciąg tekstowy.
źródło
~
nie jest aliasem w tym sensie,bash
że je interpretuje: Aliasy pozwalają na zastąpienie łańcucha słowem, gdy jest ono używane jako pierwsze słowo prostej komendy. . Jak wyjaśniam w mojej odpowiedzi poniżej, jest to raczej rozszerzenie.Jest to
bash
funkcja o nazwie Tilde Expansion . Powołując sięman bash
:Aby rozwinięcie działało, znak tyldy
~
musi być niecytowany, w przeciwnym razie znak jest traktowany dosłownie icd
kończy się niepowodzeniem, jeśli~
w bieżącym katalogu nie ma nazwanego katalogu. Zobacz tę entuzjastyczną odpowiedź na wyjaśnienie cytowania wbash
. Jeśli chcesz zacytować część ścieżki, możesz:podaj co najmniej znaki wymagające pojedynczego cudzysłowu, np
lub
podaj przynajmniej znaki, które wymagają cudzysłowu, np
lub
cytuj tylko znaki wymagające cudzysłowu, np
Rozszerzenie Tilde ma kilka ciekawszych funkcji, np .:
~+
rozwija się do wartościPWD
, tj. bieżącego katalogu roboczego~-
rozwija się do wartościOLDPWD
, tj. poprzedniego katalogu roboczego~john
rozwija się do katalogu domowego powiązanego z nazwą logowania „John”źródło
$ touch a; cd \a
. (Myślałem, że może to mieć problemycd \n
, ale eksperymenty przynajmniej w mojej wersjibash
sugerują, że działa dobrze.)Przeglądaj za pomocą
echo
poleceniaNajłatwiejszym sposobem sprawdzenia, jak działa bash, jest
echo
polecenie. W przypadku~
użycia:Jak widać, gdy pojedynczego cudzysłowu lub podwójnych cudzysłowów wokół
~
niego jest interpretowany dosłownie jako ciąg i nie jest rozwijany jako zmienna. Kiedy używasz backticks (`), jest on wykonywany jako polecenie i generuje komunikat o błędzie.źródło