web-dev-qa-db-ja.com

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

使用頻度の高い「アクセント記号」の文字が付いたファイルとフォルダ(シフトなしのチルダ、バックティック、またはプレーンな古いアクセント、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またはスクリプトとは無関係です...

注:これはisMac OS X環境ですが、 GUIはこの文字を日常的に処理するのに問題がありませんでした。通常、ターミナルで構文の問題が発生する場合は、Appleがかなりうまくいきます) GUIで動作を無効にする方法...これがバグなのか、それともそのようなパスを処理する手法が単純に不明瞭なのかわかりませんが、これまでのところ私は方法を見つけることができませんでした「それを逃れるために」

13
mralexgray

Jed Danielsが述べたように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     
$
10
Rik Schneider

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が言及するように、単一引用符でそれを行うこともできます。変数では使用できないため、これについては考えていませんでした(単一引用符で囲むと、ローカルシステムで展開されません)。

5
Jed Daniels

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

2番目の拡張を回避する最も簡単な方法は、リモートシェルを使用しないsftpを使用することです。それはまだグロブ拡張を行いますが、標準入力でコマンドを与えることができるので、ローカルのシェル拡張を完全に避けることができます。

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

(scpファイル名ではあらゆる種類のシェル機能を使用できます。たとえば、scp server:\$HOME/file destremote Shellの$HOMEの概念を使用しますが、\、それはあなたのlocalシェルを使用します。)。

3
derobert