Как избежать «` »(акцентная могила / обратный удар) на пути?

12

Я склоняюсь к префиксу часто используемых файлов и папок с символом «accent grave» (тильда без сдвига, обратная галочка или простой старый акцент, что вы скажете ...), так как это легко понять, и давайте мне сортировать вещи в алфавитном порядке, разрешая мне показывать несколько элементов сверху. Это работает хорошо, за исключением случаев, когда я обращаюсь к этим файлам через CLI или SSH / SCP.

Если я пытаюсь запустить команду, вызывая файл без экранирования, он попадает в интерактивный сеанс .. например,

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

Тем не менее, если я попробую логическое решение ↯

# 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

Я знаю, что «новым» правилом является использование синтаксиса, такого как export NOW=$(date)vs export NOW= `date` (на самом деле, у меня было время, когда я даже писал последний в синтаксисе SE MD ...), но это не связано ENVни со сценарием, ни с любым другим. ..

Примечание: Это является среда Mac OS X, но сказал, графический интерфейс никогда не имел проблем дело с этим персонажем на основе изо дня в день, и , как правило, если будет проблема синтаксиса в терминале, Apple делает довольно хорошую работу по отключению поведения в графическом интерфейсе ... Не уверен, если это ошибка, или если метод для работы с такими путями просто неясен ... но до сих пор я не смог найти способ "избежать этого" ?

mralexgray
источник
почему бы просто не использовать символ, которому не нужно убегать, как число 1?
JamesRyan
backtick - визуально - менее разрушительный (для меня), и имеет менее присущий семантический багаж при повторном представлении его как своего рода разделитель.
mralexgray

Ответы:

10

Вы можете использовать 3 обратных слеша, как упомянуто Джедом Дэниелсом, или вы можете заключить их в одинарные кавычки (')и использовать один обратный слеш.

Пример обоих приведен ниже.

$ 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     
$
Рик Шнайдер
источник
классно. Думаю, я выберу этот ответ, потому что хорошо, когда есть два способа сделать это. В любом случае, вы также можете использовать эту технику локально, используя только одну косую черту, или для обратной косой черты, без слешей и просто техники одинарных кавычек вокруг проблемного файла или каталога ... спасибо!
mralexgray
5

Три обратных слеша должны сделать это:

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

Первая обратная косая черта выходит за пределы обратной черты, поэтому она отправляется на другую сторону, но другая сторона выдает ошибку, поскольку ожидает, что обратные помехи будут в парах. Вторая обратная косая черта экранирует первую обратную косую черту, затем вам понадобятся две дополнительные обратные косые черты, чтобы вы могли отправить экранированный обратный слеш на другую сторону.

РЕДАКТИРОВАТЬ: Как упоминает Рик, вы также можете сделать это с помощью одной цитаты. Я не думал об этом, потому что вы не можете использовать его с переменными (они не будут расширяться в локальной системе, когда в одинарных кавычках).

Джед Дэниелс
источник
3

Обычно командные строки интерпретируются оболочкой один раз. Однако по историческим причинам scp передает имя файла также в удаленную оболочку, поэтому имя файла интерпретируется оболочками дважды . Это также то, что заставляет вещи scp remote:'/path/prefix*' /path/local/работать, удаленная оболочка расширяется /path/prefix*.

Самый простой способ избежать второго расширения - использовать sftp, который не использует удаленную оболочку. Он все еще выполняет расширение glob, но, поскольку вы можете давать ему команды на stdin, вы можете полностью избежать локального расширения оболочки.

Кроме этого, вы можете использовать любой из обычных механизмов цитирования оболочки, в том числе те, которые были предоставлены @Jed Daniels и @Rik Schneider, но я хотел объяснить, что на самом деле происходит, и упомянуть sftp.

(Вы можете использовать все виды функций оболочки в вашем имени файла scp, например, scp server:\$HOME/file destбудете использовать идею удаленной оболочки $HOME, тогда как, если вы удалите ее \, она будет использовать вашу локальную оболочку.).

derobert
источник