Come si evita il “'” (accento grave / backtick) in un percorso?


12

Tendo a anteporre file e cartelle spesso usati con il carattere "accento grave" (tilde non maiuscola, back-tick o accento semplice, whathaveyou ..), come è facile da raggiungere, e lasciami ordina le cose in ordine alfabetico, mentre mi consente di scegliere di mostrare alcuni elementi in alto. E funziona bene, tranne quando vado a accedere a questi file tramite la CLI o SSH / SCP.

Se provo ad eseguire un comando, chiamando il file senza caratteri di escape ↝, mi avvia a una sessione interattiva .. ad esempio ↯

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

Eppure, se provo la soluzione logica ↯

# 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

So che la "nuova" regola è quella di usare una sintassi come export NOW=$(date)vs export NOW= `date` (in effetti, ho avuto un po 'di tempo anche scrivendo quest'ultima nella sintassi di SE MD ...) ma questo non è correlato allo ENVo ad alcuno script. ..

Nota: Questo è un ambiente Mac OS X, ma detto questo, la GUI non ha mai avuto un problema che fare con questo personaggio in un giorno per giorno, e di solito, se ci sara 'un problema di sintassi nel terminale, Apple fa un ottimo lavoro nel disabilitare il comportamento nella GUI ... Non sono sicuro che si tratti di un bug o se la tecnica per gestire tali percorsi sia semplicemente oscura .. ma finora non sono riuscito a trovare un modo "per sfuggire" ?


perché non usare solo un personaggio che non ha bisogno di scappare come il numero 1?
JamesRyan,

il backtick è - visivamente - meno dirompente (per me) e ha un bagaglio semantico meno inerente quando lo si ripropone come un delimitatore di specie.
mralexgray,

Risposte:


10

È possibile utilizzare 3 barre rovesciate come indicato da Jed Daniels oppure racchiuderlo tra virgolette singole (')e utilizzare una barra rovesciata singola.

Esempi di entrambi sono di seguito.

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

eccezionale. Immagino che sceglierò questa risposta perché è bello avere due modi per farlo. in entrambi i casi puoi anche usare questa tecnica localmente, usando solo una barra, o per la barra inversa, NO SLASHES e semplicemente la tecnica a virgoletta singola attorno al file o alla directory problematici .. grazie!
mralexgray,

5

Tre barre rovesciate dovrebbero farlo:

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

La prima barra rovesciata sfugge al backtick in modo che venga inviato all'altro lato, ma l'altro lato genera l'errore perché si aspetta che i backtick siano in coppia. La seconda barra rovesciata sfugge alla prima barra rovesciata, quindi sono necessarie le due barre rovesciate aggiuntive in modo da poter inviare una barra rovesciata sfuggita all'altro lato.

EDIT: Come menziona Rik, puoi anche farlo con una sola citazione. Non ci avevo pensato perché non puoi usarlo con le variabili (non verranno espanse sul sistema locale quando tra virgolette singole).


3

Normalmente, le linee di comando vengono interpretate dalla shell una volta. Tuttavia, per motivi storici, scp passa anche il nome del file alla shell remota, quindi il nome del file viene interpretato dalle shell due volte . Questo è anche ciò che fa funzionare cose come scp remote:'/path/prefix*' /path/local/la shell remota si sta espandendo /path/prefix*.

Il modo più semplice per evitare la seconda espansione è usare sftp, che non usa una shell remota. Esegue comunque l'espansione glob, ma poiché è possibile impartire comandi su stdin, è possibile evitare completamente l'espansione della shell locale.

A parte questo, puoi usare uno qualsiasi dei normali meccanismi di quotazione della shell, inclusi quelli forniti da @Jed Daniels e @Rik Schneider, ma volevo spiegare cosa sta realmente accadendo e menzionare sftp.

(Puoi usare tutti i tipi di funzionalità della shell nel tuo nome file scp, per esempio scp server:\$HOME/file destuserai l' idea della shell remota di $HOME, mentre se togliessi \, userebbe la shell locale .).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.