Назад | Перейти на главную страницу

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

Я предпочитаю использовать приставку часто файлы и папки с символом "акцентная могила" (тильда без сдвига, обратный тик или старый акцент, ну что ж ...), так как это легко понять, и позвольте мне отсортировать вещи в алфавитном порядке, позволяя мне отображать несколько элементов вверху. Это работает нормально, за исключением случаев, когда я получаю доступ к этим файлам через интерфейс командной строки или 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) против export NOW= `дата` (на самом деле, у меня было время, даже письмо последнее в синтаксисе SE MD ...), но это не связано с ENV или любой сценарий ...

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

Вы можете использовать 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     
$

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

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

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

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

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

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

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

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