Как избежать " ` " (акцентная могила / обратный удар) на пути?
Я склоняюсь к префиксу часто используемых файлов и папок с символом "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)
против export NOW=
`date` (на самом деле, у меня было время, когда я писал последние в синтаксисе SE MD...), но это не имеет отношения к ENV
или любой скрипт...
Примечание. Это среда Mac OS X, но, тем не менее, в графическом интерфейсе никогда не было проблем с этим символом на повседневной основе, и обычно, если в терминале будет проблема с синтаксисом, Apple делает довольно хорошую работу по отключению поведения в графическом интерфейсе... Не уверен, если это ошибка, или если техника для работы с такими путями просто неясна... но до сих пор я не смог найти способ "избежать этого"?
3 ответа
Вы можете использовать 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, но, поскольку вы можете давать ему команды на stdin, вы можете полностью избежать локального расширения оболочки.
Кроме этого, вы можете использовать любой из обычных механизмов цитирования оболочки, в том числе те, которые были предоставлены @Jed Daniels и @Rik Schneider, но я хотел объяснить, что на самом деле происходит, и упомянуть sftp.
(Вы можете использовать все виды функций оболочки в вашем имени файла scp, например scp server:\$HOME/file dest
будет использовать идею удаленной оболочки $HOME
тогда как, если вы вынули \
, он будет использовать вашу локальную оболочку.)