Jak można uciec przed „'” (grave / backcick) na ścieżce?

13

Często używam przedrostków używanych plików i folderów znakiem „akcent grave” (tylda non-shift, tyknięcie w tył lub zwykły akcent, co chcesz…), ponieważ łatwo się do niego dostać, i pozwól mi posortuj rzeczy alfabetycznie, pozwalając mi pokazać kilka pozycji na górze. To działa dobrze, z wyjątkiem, gdy idę do dostępu do tych plików za pomocą interfejsu CLI lub SSH / SCP.

Jeśli spróbuję uruchomić polecenie, wywołanie pliku bez zmian ↝ powoduje, że przechodzę do sesji interaktywnej .. na przykład ↯

# scp -r dns.local:/`Downloads/CrazyRussianCars/ ~/
↩
>

Ale jeśli spróbuję logicznego rozwiązania ↯

# scp -r dns.local:/\`Downloads/CrazyRussianCars/ ~/
↩
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

Wiem, że „nową” zasadą jest użycie składni takiej jak export NOW=$(date)vs export NOW= „data” (w rzeczywistości miałem trochę czasu, nawet pisząc tę ostatnią w składni SE MD ...), ale nie jest to związane z ENVżadnym skryptem. ..

Uwaga: To jest środowisko Mac OS X, ale powiedział, że GUI nigdy nie miałem problemu radzenia sobie z tym charakterze na zasadzie z dnia na dzień, a zwykle, jeśli nie będzie to problem składni w terminalu, Apple robi całkiem dobrą robotę, wyłączając zachowanie w GUI ... Nie jestem pewien, czy to błąd, czy też technika radzenia sobie z takimi ścieżkami jest po prostu niejasna ... ale jak dotąd nie byłem w stanie znaleźć sposób „uciec” ?

mralexgray
źródło
dlaczego nie użyć po prostu znaku, który nie musi uciekać, jak cyfra 1?
JamesRyan
backtick jest - dla mnie - mniej uciążliwy (dla mnie) i ma mniej nieodłączny bagaż semantyczny, gdy ponownie go przeznaczam jako ogranicznik rodzaju.
mralexgray

Odpowiedzi:

10

Możesz użyć 3 odwrotnych ukośników, o których wspomniał Jed Daniels, lub możesz zawinąć je w pojedyncze cudzysłowy (')i użyć pojedynczego odwrotnego ukośnika.

Przykłady obu są poniżej.

$ touch dir/'`rik' 
$ ls -l dir
total 1865376
-rw-r--r--  1 rik  staff          0 Jul  1 09:51 `rik 
$ scp localhost:dir/\\\`rik ./ `rik         
100%    0     0.0KB/s   00:00     
$ scp localhost:dir/'\`rik' ./ `rik     
100%    0     0.0KB/s   00:00     
$
Rik Schneider
źródło
niesamowite. Myślę, że wybiorę tę odpowiedź, ponieważ miło jest mieć dwa sposoby, aby to zrobić. Tak czy inaczej, możesz również użyć tej techniki lokalnie, używając tylko jednego ukośnika, lub dla awersji do ukośnika, BEZ SLAJDÓW i po prostu techniki pojedynczego cudzysłowu wokół problematycznego pliku lub katalogu ... dzięki!
mralexgray
5

Powinny to zrobić trzy ukośniki odwrotne:

jed@jed-osx:~$ ls -la \`foo
ls: `foo: No such file or directory
jed@jed-osx:~$ scp desk:\\\`foo .
`foo                                            100%    0     0.0KB/s   00:00    
jed@jed-osx:~$ ls -la \`foo
-rw-r--r--  1 jed  staff  0 Jul  1 09:45 `foo
jed@jed-osx:~$ rm \`foo

Pierwszy odwrotny ukośnik ucieka przed lewostronnym, więc zostaje wysłany na drugą stronę, ale druga strona zgłasza błąd, ponieważ oczekuje, że lewy wsteczny będzie w parach. Drugi ukośnik odwraca się od pierwszego ukośnika, następnie potrzebujesz dwóch dodatkowych ukośników, aby móc wysłać ukośnik odwrotny na drugą stronę.

EDYCJA: Jak wspomina Rik, możesz to zrobić z jednym cytatem. Nie pomyślałem o tym, ponieważ nie możesz nam tego zrobić za pomocą zmiennych (nie będą one rozszerzane w systemie lokalnym, gdy będą w pojedynczych cudzysłowach).

Jed Daniels
źródło
3

Zwykle wiersze poleceń są interpretowane przez powłokę jeden raz. Jednak ze względów historycznych scp przekazuje również nazwę pliku do powłoki zdalnej, więc nazwa pliku jest interpretowana przez powłoki dwukrotnie . To również sprawia, że ​​rzeczy scp remote:'/path/prefix*' /path/local/działają, zdalna powłoka się rozwija /path/prefix*.

Najłatwiejszym sposobem uniknięcia drugiego rozszerzenia jest użycie sftp, który nie używa zdalnej powłoki. Nadal wykonuje ekspansję globalną, ale ponieważ można jej wydawać polecenia na standardowe wejście, można całkowicie uniknąć lokalnej ekspansji powłoki.

Poza tym możesz użyć dowolnego z normalnych mechanizmów cytowania powłoki, w tym tych podanych przez @Jeda Danielsa i @Rik Schneider, ale chciałem wyjaśnić, co się właściwie dzieje i wspomnieć o sftp.

(Możesz używać wszelkiego rodzaju funkcji powłoki w nazwie pliku scp, na przykład scp server:\$HOME/file destużyje pomysłu zdalnej powłoki $HOME, podczas gdy gdybyś ją wyjął \, użyłby twojej powłoki lokalnej ).

derobert
źródło