パス内の「 `」(アクセント記号/バックティック)をどのようにエスケープしますか?


12

よく使うファイルやフォルダには、「アクセント記号」文字(非シフトチルダ、バックティック、または普通のアクセント、whathaveyou ..)をプレフィックスとして付ける傾向があります。項目をアルファベット順に並べ替えながら、いくつかの項目を上部に表示することを選択できます。それは私が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環境ですが、GUIには日常的にこの文字を扱う際に問題が発生したことはありません。通常、ターミナルで構文の問題が発生する場合は、Apple GUIでの動作を無効にするのはかなり良い仕事をしない...これはバグである、またはそのような経路に対処するための技術は、単にあいまいされた場合に確認してください場合..しかし、これまでのところ、私がun-できる見つけることがされています「逃げる」方法


数字1のようにエスケープする必要のない文字を使用しないのはなぜですか?
ジェームズライアン

バックティックは(視覚的に)破壊的ではなく(私にとっては)、ソート区切りとして再利用する際の固有の意味的手荷物が少ない。
mralexgray

回答:


10

Jed Danielsが述べたように3つのバックスラッシュを使用できます。または、単一引用符(')で囲み、1つのバックスラッシュを使用できます。

両方の例を以下に示します。

$ 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     
$

驚くばかり。私はこの答えを選ぶと思います。なぜなら、それを行うには2つの方法があるからです。どちらの方法でも、1つのスラッシュだけを使用してこの手法をローカルで使用することも、スラッシュを回避するために、NO SLASHESおよび問題のあるファイルまたはディレクトリを囲む単一引用符の手法を使用することもできます。
mralexgray

5

3つのバックスラッシュでそれを行う必要があります。

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

最初のバックスラッシュはバックティックをエスケープするため、反対側に送信されますが、バックティックがペアになることを期待しているため、反対側はエラーをスローします。2番目のバックスラッシュは最初のバックスラッシュをエスケープします。次に、エスケープされたバックスラッシュを反対側に送信できるように、余分な2つのバックスラッシュが必要です。

編集:Rikが言及しているように、一重引用符でそれを行うこともできます。変数を使用してこれを行うことはできないため、これについては考えていませんでした(単一引用符で囲まれている場合、ローカルシステムで展開されません)。


3

通常、コマンドラインはシェルによって1回解釈されます。ただし、歴史的な理由により、scpはファイル名もリモートシェルに渡すため、ファイル名はシェルによって2回解釈されます。これはscp remote:'/path/prefix*' /path/local/、リモートシェルが拡張しているということを機能させるものでもあり/path/prefix*ます。

2番目の拡張を回避する最も簡単な方法は、リモートシェルを使用しないsftpを使用することです。まだglob展開を行いますが、stdinでコマンドを与えることができるため、ローカルシェル展開を完全に回避できます。

それ以外は、@ Jed Danielsや@Rik Schneiderが提供するものなど、通常のシェルの引用メカニズムを使用できますが、実際に何が起こっているのかを説明し、sftpについて言及したいと思いました。

(たとえば、scpファイル名であらゆる種類のシェル機能を使用できます。たとえばscp server:\$HOME/file destリモートシェルのを使用し$HOMEますが、を取り出した場合はローカルシェルを\使用します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.