Czy w pwd można mieć spacje specjalne?

21

Chciałbym, aby skopiować bieżący katalog do schowka, coś takiego: pwd | pbcopy. Nie pwduchodzi jednak z miejsca, więc na przykład coś w „Obsługi aplikacji” nie jest poprawnie kopiowane. Wydaje mi się, że nie pamiętam, aby zawsze tak było, więc mogłem coś wyśmiewać. Korzystanie z iTerm2.

Czy istnieje ustawienie bash, aby uciec od wszystkiego? problemy z wyszukiwaniem, zbyt wiele pytań / tematów na temat Spaces.app lub esc.

Obecny:

$ pwd
/Library/Application Support/Google Earth/

Preferowane:

$ pwd
/Library/Application\ Support/Google\ Earth/

Widoczne już posty: Kopiowanie ścieżki bieżącego katalogu do schowka i Jak wykonać cd do katalogu o nazwie zawierającej spacje w bash? , które nie rozwiązują tego. W pierwszym przypadku skomentowałbym to, ale nie mam przywilejów.

Greenwar
źródło
1
Wątpię, czy kopia jest poprawna - co chcesz, aby wklejać do spacji - w której aplikacji wklejasz?
user151019
Świetne pytanie. Wkrótce będziesz miał wystarczająco dużo przedstawicieli, aby skomentować. Witamy na stronie!
bmike
1
pwd | pbcopydziała dobrze dla mnie w terminalu. Finder / Edytuj / Pokaż schowek potwierdza, że ​​jest w porządku.
lhf
@lhf Tak, powinienem był sprawdzić w Terminalu, który działa tak jak powiedziałeś. Jednak brak szczęścia w iTerm2. Może powinienem wrócić ...
Greenwar
Jak może to zależeć od uruchomionego emulatora terminala? Właśnie przetestowałem i pwd | pbcopydziała dobrze w iTerm2.
lhf

Odpowiedzi:

13

To polecenie poprawnie unika spacji:

printf "%q\n" "$(pwd)" | pbcopy

Możesz dokonać aliasu, używając czegoś z historią, np. cwdJeśli nie masz nic przeciwko ponownej definicji innego pliku cwd

alias cwd='printf "%q\n" "$(pwd)" | pbcopy'

Porzuć rurę do pbcopy, jeśli chcesz, aby działała bardziej jak pwd i po prostu wydrukuj ścieżkę ucieczki.

Glenn Jackman
źródło
nie działa na
Macu
1
Działa na moim komputerze Mac.
Jason Swett
5
pwd | sed 's/ /\\ /g'

Ale nie jestem pewien, czy to ostatecznie rozwiąże problem. pbcopy kopiuje dokładnie to, co otrzymuje na standardowym wejściu.

znak
źródło
Ucieknie to tylko spacjom, co nie jest prawie wystarczające, mimo że OP wykorzystał to jako przykład.
Old Pro
ale to działa w większości przypadków właściwy z Glenn nie zadziałał na moim
Macu,
Możesz także użyć go jako aliasu, kiedy deklarujesz funkcję: function escapePWD () {pwd | sed 's / / \\ / g'; } i użyj tego dla aliasu: alias epwd = 'escapePWD'
Macilias 14.04.16
1

Nie ma wbudowanego sposobu tworzenia pwdwyjściowych ścieżek do plików, ponieważ jest to na ogół nieprzydatne.

To nie ma sensu, pwdalbo pbcopydo dodawania backslashy co jest kopiowane. Jeśli chcesz skopiować ścieżkę do pliku tekstowego lub posta internetowego, nie chcesz wstawiać ukośnika odwrotnego.

Prawdopodobnie to, co chcesz zrobić, to utworzyć osobny alias, na przykład qwdwydrukować cytowaną formę bieżącego katalogu lub po prostu uciec od wyniku pbpaste, co jest tak proste, jak umieszczenie go w cudzysłowach:

bash-3.2$ pwd
/Users/user
bash-3.2$ cd test\ dir/untitled\ \"folder/
bash-3.2$ pwd
/Users/user/test dir/untitled "folder
bash-3.2$ pwd | pbcopy
bash-3.2$ echo "`pbpaste`"
/Users/user/test dir/untitled "folder
bash-3.2$ cd
bash-3.2$ pwd
/Users/user
bash-3.2$ cd `pbpaste`
bash: cd: /Users/user/test: No such file or directory
bash-3.2$ cd "`pbpaste`"
bash-3.2$ pwd
/Users/user/test dir/untitled "folder

Pamiętaj, że nie tylko przestrzenie wymagają ucieczki. Cięcia do przodu i do tyłu, gwiazda, znak zapytania, znak ampersand, średnik i inne znaki również wymagają ucieczki. Najbezpieczniej jest użyć podwójnych cudzysłowów, jak w przykładzie, który zadziała, nawet jeśli ścieżka zawiera w sobie cudzysłowy.

Jeśli chcesz być przewrotny, AppleScript może zacytować bieżący katalog:

bash-3.2$ alias qwd="osascript -e 'return quoted form of POSIX path of (POSIX file \"./\" as alias)'"
bash-3.2$ qwd
'/Users/user/test dir/untitled "folder'

W przeciwnym razie w większości zgadzam się z Glennem, z wyjątkiem, jak wyżej, aliasu cytowanego formularza, aby qwdnie zakłócać normalności pwd:

alias qwd='printf "%q\n" "$(pwd)"'
Old Pro
źródło