2012-01-19 15 views
9

Estoy intentando escribir un alias que saltará al directorio descendiente de cwd que contiene un archivo (o en la primera find encontrado ocurrencia de un nombre de archivo tal):Bash: acentos abiertos anidadas en problemas de la causa de alias

la siguiente combinación de comandos logra el resultado deseado:

cd `dirname \`find -name 'MyFile.txt' | sed -n 1p\`` 

sin embargo, me parece que no puede escapar de esto de la manera correcta para crear un alias de trabajo:

alias jump="cd \`dirname \\\`find -name '$1' | sed -n 1p\\\`\`" 

Salida:

/* 
dirname: missing operand 
Try `dirname --help' for more information. 
bash: cd: find: No such file or directory 

Mi lógica es que tienen que escapar de acentos abiertos en una cadena entre comillas dobles con una sola \ y no pueden hacer \\ se traduce a una sola barra invertida dentro de una cadena, por lo que el segundo requiere backtick anidada 1 + 2 = 3.

¿Alguna sugerencia?

Respuesta

13

Un alias no puede tomar un argumento como $1. Use una función en su lugar.

También use $(command) para la sustitución de comandos en lugar de los backticks, ya que es más fácil anidar.

La función sería:

jump() { 
    cd $(dirname $(find -name "$1" | sed -n 1p)) 
} 
+0

Gracias a todos por la información en dólares. Gracias especiales a dogbane por responder la pregunta exacta que hice: cómo crear un alias con este enfoque. – KomodoDave

3

Backticks no ofrece anidamiento. Intente utilizar command substitution que tiene la sintaxis $(..)

En su caso, será

cd $(dirname $(find /path/to/search -name 'MyFile.txt' | sed -n 1p)) 
+0

invertidas hacer oferta de anidación, pero usted tiene que escapar de ellos con barras invertidas, que rápidamente se convierte en difícil de manejar para múltiples niveles de anidamiento. La sintaxis '$ {..}' es mucho más fácil para los ojos. – mjuarez

2

acentos abiertos son la antigua forma de command substitution, y no se pueden anidar fácilmente. Sin embargo, el nuevo $()form hace nido fácilmente:

cd $(dirname $(find -name 'MyFile.txt' | sed -n 1p)) 
Cuestiones relacionadas