Tengo un shell / terminal basado en navegador que ejecuta comandos bash y escapo espacios, pero resulta que los paréntesis también deben escaparse. ¿Qué otros caracteres se deben escapar para los nombres de archivo que no están entre comillas?
12
mv filename filename-foo
en bash, ¿de qué caracteres necesito escapar, además de espacios y paréntesis?mv "$filename" "$newname"
.Respuestas:
La solución simple es poner una comilla simple (
'
) al principio y otra comilla simple al final, y reemplazar cada'
carácter dentro del nombre del archivo por la secuencia de 4 caracteres'\''
. Todos los caracteres pierden su significado especial dentro de una cadena entre comillas simples, excepto en'
sí mismo, que marca el final de la cadena. La secuencia'\''
finaliza el literal entre comillas simples, inmediatamente sigue por una comilla simple entre comillas y abre un nuevo literal entre comillas simples. Por lo tanto, el nombre del archivose puede citar de la siguiente manera:
Las comillas dobles tienen reglas de escape más complejas y no le permiten incluir un signo de exclamación
!
si la sustitución del historial está activada, por lo que no las consideraré más.Un enfoque alternativo es proteger a los personajes con barras invertidas. Esto funciona para todos los personajes excepto las líneas nuevas; para una nueva línea, ponerla entre comillas simples (o comillas dobles) es la única solución. Si desea minimizar el número de barras invertidas para presentar el nombre citado al usuario, puede restringirlo a los lugares donde se necesita la barra invertida; sin embargo, cuantas más barras invertidas omita, más se arriesga a olvidar una que sea necesaria. Las letras, los dígitos y los caracteres no ASCII siempre están bien¹. Cite espacios en blanco y signos de puntuación cuando no esté seguro.
Con un shell típico (ksh, bash o zsh), debe citar los siguientes caracteres en al menos algunas circunstancias.
!
- expansión de la historia."
- sintaxis de shell.#
- comience el comentario cuando esté precedido por espacios en blanco; Comodines zsh.$
- sintaxis de shell.&
- sintaxis de shell.'
- sintaxis de shell.(
- incluso en medio de una palabra: ksh globs extendido (también disponible en bash y zsh); Comodines zsh.)
(ver(
)*
- sh comodín.,
- solo dentro de la expansión del aparato ortopédico.;
- sintaxis de shell.<
- sintaxis de shell.=
- en zsh, cuando está al comienzo de un nombre de archivo (expansión de nombre de archivo con búsqueda de RUTA).>
- sintaxis de shell.?
- sh comodín.[
- sh comodín.\
- sintaxis de shell.]
- puede salirse con la suya sin citarlo.^
- expansión de la historia; comodín zsh.`
- sintaxis de shell.{
- expansión de la abrazadera.|
- sintaxis de shell.}
- necesita ser escapado en zsh, otros shells son más indulgentes cuando no hay una llave de apertura correspondiente.~
- expansión del directorio de inicio cuando está al comienzo de un nombre de archivo; comodín zsh; siempre a salvo cuando es el último personaje.Algunos caracteres más pueden requerir un manejo especial a veces:
-
no es especial para el shell, pero cuando está al comienzo de un argumento de comando, indica una opción. No se puede proteger con comillas ya que el manejo especial está en el comando, no en el shell. Para proteger un nombre de archivo que comienza con-
, puede colocarlo./
antes; de esta manera sigue siendo el mismo archivo, pero el argumento ya no comienza-
..
no es especial en sí mismo, pero los archivos de puntos están excluidos de los*
globos de forma predeterminada.:
no es especial para el shell, pero algunos comandos lo analizan especialmente, por ejemplo, para indicar un archivo remoto (hostname:filename
). Consulte la documentación del comando para ver cómo hacer frente a los nombres de archivo que contienen dos puntos.¹ A menos que el usuario haya configurado caracteres de expansión de historial alternativos. Algunos proyectiles lo permiten. Esta es otra razón para usar comillas simples en lugar de barras invertidas.
fuente
LF
solo, se pueden citar con una barra diagonal inversa en algunos shells.