Używam Bash na macOS X i chciałbym utworzyć prosty wykonywalny plik skryptu, który po uruchomieniu zmieniłby się na inny katalog. Jednak ścieżka do tego katalogu zawiera spacje. Jak do cholery to robisz? Oto, co mam ...
Nazwa pliku: cdcode
Zawartość pliku:
cd ~/My Code
Przyznaję, że nie jest to długa nazwa ścieżki, ale moja rzeczywista nazwa ścieżki ma głębokość pięciu katalogów, a cztery z nich mają spacje w ścieżce.
BTW, ja próbowałem cd "~/My Code"
i cd "~/My\ Code"
i żaden z nich nie pracował.
Odpowiedzi:
Kiedy podwójnie cytujesz ścieżkę, zatrzymujesz ekspansję tyldy. Można to zrobić na kilka sposobów:
cd ~/"My Code" cd ~/'My Code'
Tylda nie jest tutaj cytowana, więc rozszerzenie tyldy będzie nadal działać.
cd "$HOME/My Code"
Możesz rozwinąć zmienne środowiskowe wewnątrz ciągów w podwójnych cudzysłowach; jest to w zasadzie to, co robi rozszerzenie tyldy
cd ~/My\ Code
Możesz również zmienić znaczenie znaków specjalnych (takich jak spacja) za pomocą odwrotnego ukośnika.
źródło
Znalazłem rozwiązanie poniżej na tej stronie :
x="test\ me" eval cd $x
Połączenie
\
stałej w tekście w podwójnym cudzysłowie ieval
przedcd
powoduje, że działa to jak urok!źródło
eval
.eval
.Po zmaganiu się z tym samym problemem wypróbowałem dwa różne rozwiązania, które działają:
1. Użyj podwójnych cudzysłowów (
""
) ze zmiennymi.Najłatwiej jest po prostu podwójnie cytować zmienne, jak wskazano w poprzedniej odpowiedzi:
cd "$yourPathWithBlankSpace"
2. Skorzystaj z
eval
.Zgodnie z tą odpowiedzią polecenie Unix, aby uciec ze spacji , możesz usunąć puste miejsce, a następnie użyć
eval
, na przykład:yourPathEscaped=$(printf %q "$yourPathWithBlankSpace") eval cd $yourPathEscaped
źródło
cd ~/My\ Code
wydaje mi się, że działa dla mnie ... Jeśli upuszczanie cudzysłowów, ale zachowanie ukośnika nie działa, czy możesz opublikować przykładowy kod?
źródło
Możesz użyć dowolnego z:
cd ~/"My Code" cd ~/M"y Code" cd ~/My" Code"
Nie możesz użyć:
cd ~"/My Code"
Pierwsza działa, ponieważ powłoka rozszerza ~ / do $ HOME /, a następnie dostosowuje Mój kod bez podwójnych cudzysłowów. Druga kończy się niepowodzeniem, ponieważ nie ma użytkownika o nazwie „
"
” (podwójny cudzysłów), do którego~"
można zmapować.źródło
U mnie działa pojedynczy lewy ukośnik:
ry4an@ry4an-mini:~$ mkdir "My Code" ry4an@ry4an-mini:~$ vi todir.sh ry4an@ry4an-mini:~$ . todir.sh ry4an@ry4an-mini:My Code$ cat ../todir.sh #!/bin/sh cd ~/My\ Code
Czy na pewno problem nie polega na tym, że twój skrypt powłoki zmienia katalog w swojej podpowłoce, ale po zakończeniu jesteś z powrotem w głównej powłoce (i oryginalnym katalogu)? Uniknąłem tego, używając. aby uruchomić skrypt w bieżącej powłoce, chociaż większość ludzi użyłaby do tego aliasu. Przestrzenie mogą być czerwonym śledziem.
źródło
Unikaj ~ w skryptach; użyj zamiast tego $ HOME.
źródło
Podczas pracy pod Linuksem składnia poniżej jest poprawna:
cd ~/My\ Code
Jednak podczas wykonywania pliku użyj poniższej składni:
$ . cdcode
(tylko „.”, a nie „./”)
źródło
użyj podwójnych cudzysłowów
go () { cd "$*" }
źródło
.bashrc
pliku do zmiany katalogu podczas wklejania nazw katalogów zawierających spacje do wiersza poleceń bez konieczności ucieczki spacji lub cytowania całości.cds
to jednak lepsze imię.go
będzie to równoważnecd
np. Cd do katalogu domowego?Bardzo prostym sposobem na to jest-
$ cd My\ Folder
W bashu uruchom polecenie DIR, a w wynikach zobaczysz, że nazwy folderów lub ścieżek mające spację między nimi zostały zapisane w wynikach takich jak ten -
$dir My\ Folder New\ Folder
źródło
To zrobi to:
cd ~/My\ Code
Musiałem tego używać do pracy z plikami przechowywanymi na iCloud Drive. Nie będziesz chciał używać podwójnych cudzysłowów ("), ponieważ wtedy musi to być ścieżka bezwzględna. Innymi słowy, nie możesz łączyć podwójnych cudzysłowów z tyldą (~).
Na przykład musiałem użyć tego do niedawnego projektu:
cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project
Mam nadzieję że to pomogło.
źródło
Miałem podobny problem teraz, gdy używałem skryptu bash do zrzucenia niektórych danych. Skończyło się na utworzeniu dowiązania symbolicznego w folderze skryptów bez żadnych spacji. Następnie wskazałem mój skrypt na dowiązanie symboliczne i to działa dobrze.
Aby utworzyć łącze. ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]
Mau lub może nie być przydatne.
źródło
Użyj apostrofów, takich jak:
myPath=~/'my dir' cd $myPath
źródło