¿Cómo se escapa el "" "(acento grave / retroceso) en un camino?

12

Tiendo a prefijar los archivos y carpetas que se usan con frecuencia con el carácter "acento grave" (tilde sin mayúsculas, tick de retroceso o acento simple), ya que es fácil de entender, y déjenme ordenar las cosas alfabéticamente, mientras me permite elegir mostrar algunos elementos en la parte superior. Se trabaja muy bien, excepto cuando voy a acceder a estos archivos a través de la CLI o SSH / SCP.

Si intento ejecutar un comando, llamar al archivo sin escape ↝ me inicia en una sesión interactiva ... por ejemplo ↯

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

Sin embargo, si intento la solución lógica ↯

# 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

Sé que la regla "nueva" es usar una sintaxis como export NOW=$(date)vs export NOW= `date` (de hecho, tuve un tiempo incluso escribiendo la última en la sintaxis de SE MD ...) pero esto no está relacionado con el ENVscript ni con ninguno. ..

Nota: Este es un entorno Mac OS X, pero dicho esto, la GUI nunca ha tenido problemas para tratar con este personaje en el día a día y, por lo general, si va a haber un problema de sintaxis en la Terminal, Apple hace un buen trabajo al deshabilitar el comportamiento en la GUI ... No estoy seguro de si esto es un error, o si la técnica para tratar con estos caminos es simplemente oscura ... pero hasta ahora, no he podido encontrar un manera "para escapar de él" ?

mralexgray
fuente
¿Por qué no usar un personaje que no necesita escapar como el número 1?
JamesRyan
el backtick es, visualmente, menos perturbador (para mí) y tiene menos equipaje semántico inherente cuando se vuelve a utilizar como un delimitador de tipo.
mralexgray 01 de

Respuestas:

10

Puede usar 3 barras invertidas como lo menciona Jed Daniels o puede envolverlo entre comillas simples (')y usar una barra invertida simple.

Ejemplo de ambos están a continuación.

$ 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
fuente
increíble. Creo que elegiré esta respuesta porque es bueno tener dos formas de hacerlo. De cualquier manera, también puede usar esta técnica localmente, usando solo una barra oblicua, o para la barra diagonal, NO SLASHES y simplemente la técnica de comillas simples alrededor del archivo o directorio problemático ... ¡gracias!
mralexgray 01 de
5

Tres barras invertidas deberían hacerlo:

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 primera barra diagonal inversa escapa de la barra de retroceso para que se envíe al otro lado, pero la otra parte arroja el error porque espera que las barras de retroceso estén en pares. La segunda barra invertida escapa a la primera barra invertida, luego necesita las dos barras invertidas adicionales para poder enviar una barra invertida escapada al otro lado.

EDITAR: como menciona Rik, también puede hacerlo con una sola cita. No había pensado en esto porque no puede usarlo con variables (no se expandirán en el sistema local cuando se encuentran entre comillas simples).

Jed Daniels
fuente
3

Normalmente, las líneas de comando son interpretadas por el shell una vez. Sin embargo, por razones históricas, scp también pasa el nombre del archivo al shell remoto, de modo que el shells lo interpreta dos veces . Esto también es lo que hace que cosas como el scp remote:'/path/prefix*' /path/local/trabajo, el shell remoto se esté expandiendo /path/prefix*.

La forma más fácil de evitar la segunda expansión es usar sftp, que no usa un shell remoto. Todavía hace la expansión global, pero como puede darle comandos en stdin, puede evitar la expansión de su shell local por completo.

Aparte de eso, puede usar cualquiera de los mecanismos de cotización de shell normales, incluidos los proporcionados por @Jed Daniels y @Rik Schneider, pero quería explicar lo que realmente está sucediendo y mencionar sftp.

(Puede usar todo tipo de funciones de shell en su nombre de archivo scp, por ejemplo scp server:\$HOME/file dest, utilizará la idea del shell remoto$HOME , mientras que si elimina el \, usaría el shell local ).

derobert
fuente