Wie entkommt man dem "` "(Akzentgrab / Backtick) auf einem Weg?

12

Ich neige dazu, häufig verwendeten Dateien und Ordnern das Zeichen "Akzentgrab" (Non-Shift-Tilde, Back-Tick oder einfacher alter Akzent, was auch immer ...) voranzustellen, da es leicht zu erreichen ist, und lassen Sie mich Sortieren Sie die Dinge alphabetisch, während ich einige Elemente oben anzeigen kann. Es funktioniert gut, außer wenn ich über die CLI oder SSH / SCP auf diese Dateien zugreife.

Wenn ich versuche, einen Befehl auszuführen und die Datei ungehindert aufrufe, wird ich in eine interaktive Sitzung versetzt. Zum Beispiel

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

Aber wenn ich die logische Lösung versuche ↯

# 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

Ich weiß, dass die "neue" Regel darin besteht, eine Syntax wie export NOW=$(date)vs export NOW= `date` zu ​​verwenden (tatsächlich hatte ich eine Zeit damit, letztere sogar in SE MD-Syntax zu schreiben ...), aber dies hat nichts mit dem ENVoder einem Skript zu tun . ..

Hinweis: Dies ist eine Mac OS X-Umgebung, aber die GUI hatte nie ein Problem mit dem täglichen Umgang mit diesem Zeichen, und normalerweise, wenn im Terminal ein Syntaxproblem auftritt, Apple macht einen ziemlich guten Job beim Deaktivieren des Verhaltens in der GUI ... Ich bin mir nicht sicher, ob dies ein Fehler ist oder ob die Technik für den Umgang mit solchen Pfaden einfach unklar ist. Aber bisher konnte ich keinen finden Weg "um ihm zu entkommen" ?

mralexgray
quelle
Warum nicht einfach ein Zeichen verwenden, das nicht wie die Nummer 1 entkommen muss?
James Ryan
Der Backtick ist - visuell - weniger störend (für mich) und hat weniger inhärentes semantisches Gepäck, wenn er als Sortentrennzeichen verwendet wird.
Mralexgray

Antworten:

10

Sie können 3 Backslashes verwenden, wie von Jed Daniels erwähnt, oder Sie können es in einfache Anführungszeichen setzen (')und einen einzelnen Backslash verwenden.

Beispiele für beide sind unten.

$ 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     
$
Rik Schneider
quelle
genial. Ich denke, ich werde diese Antwort wählen, weil es schön ist, zwei Möglichkeiten zu haben, dies zu tun. So oder so können Sie diese Technik auch lokal verwenden, indem Sie nur einen Schrägstrich verwenden, oder für die Schrägstrich-Abneigung NO SLASHES und einfach die einfache Anführungszeichen-Technik um die problematische Datei oder das problematische Verzeichnis. Danke!
Mralexgray
5

Drei Backslashes sollten es tun:

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

Der erste Backslash entgeht dem Backtick, sodass er an die andere Seite gesendet wird. Die andere Seite gibt jedoch den Fehler aus, da erwartet wird, dass Backticks paarweise vorliegen. Der zweite Backslash entgeht dem ersten Backslash. Dann benötigen Sie die zusätzlichen zwei Backslashes, damit Sie einen Escape-Backslash an die andere Seite senden können.

EDIT: Wie Rik erwähnt, können Sie dies auch mit einem einzigen Anführungszeichen tun. Ich hatte nicht daran gedacht, weil Sie es uns nicht mit Variablen geben können (sie werden auf dem lokalen System nicht in einfachen Anführungszeichen erweitert).

Jed Daniels
quelle
3

Normalerweise werden Befehlszeilen einmal von der Shell interpretiert. Aus historischen Gründen übergibt scp den Dateinamen jedoch auch an die Remote-Shell, sodass der Dateiname zweimal von Shells interpretiert wird . Dies ist auch das, was Dinge wie scp remote:'/path/prefix*' /path/local/Arbeit macht, die Remote-Shell erweitert sich /path/prefix*.

Der einfachste Weg, um die zweite Erweiterung zu vermeiden, ist die Verwendung von SFTP, das keine Remote-Shell verwendet. Die Glob-Erweiterung wird weiterhin ausgeführt. Da Sie jedoch Befehle für stdin eingeben können, können Sie die lokale Shell-Erweiterung vollständig vermeiden.

Abgesehen davon können Sie jeden der normalen Shell-Quoting-Mechanismen verwenden, einschließlich der von @Jed Daniels und @Rik Schneider, aber ich wollte erklären, was tatsächlich passiert, und sftp erwähnen.

(Sie können alle Arten von Shell-Funktionen in Ihrem scp-Dateinamen verwenden. scp server:\$HOME/file destVerwenden Sie beispielsweise die Idee der Remote- Shell von $HOME, während beim \Herausnehmen die Funktionen Ihrer lokalen Shell verwenden würden.)

derobert
quelle