Pregunta

¿Hay una manera menos fuerza bruta para hacer esto?

#!/bin/ksh
THIS_SCRIPT=$(/usr/bin/readlink -f $(echo $0 | /bin/sed "s,^[^/],$PWD/&,"))
echo $THIS_SCRIPT

Estoy atascado utilizando ksh pero preferiría una solución que funciona en bash demasiado (que creo que esto lo hace).

¿Fue útil?

Solución

Entrada # 28 en el FAQ bash:

  

¿Cómo se determina la ubicación de mi guión? Quiero leer algunos archivos de configuración desde el mismo lugar.

     

Hay dos razones principales por qué este tema surge: o se quieren externalizar datos o configuración de su guión y necesitan una manera de encontrar estos recursos externos, o la secuencia de comandos está destinado a actuar sobre un paquete de algún tipo (por ejemplo, . un script de compilación), y necesita encontrar los recursos para actuar.

     

Es importante darse cuenta de que, en el caso general, este problema no tiene solución. Cualquier enfoque que podría haber oído hablar, y cualquier enfoque que se detalla a continuación, tiene defectos y sólo funcionarán en casos específicos. En primer lugar, tratar de evitar el problema en su totalidad por no dependiendo de la ubicación de su guión!

     

...

     

Uso BASH_SOURCE

     

La variable golpe interna BASH_SOURCE es en realidad una serie de nombres de ruta. Si expande como una cadena sencilla, por ejemplo, "$ BASH_SOURCE", obtendrá el primer elemento, que es el nombre de ruta de la función o el script se está ejecutando actualmente.

Otros consejos

Siempre he hecho:

SCRIPT_PATH=$(cd `dirname ${0}`; pwd)

Nunca he usado antes readlink: ¿es Gnu solamente? (Es decir, ¿Funcionará en HP-UX, AIX y Solaris fuera de la caja? DirName y voluntad pwd ....)

(Editado para añadir `` lo que se me olvidó en post original. D'oh!) (2 editar para poner en dos líneas que yo he hecho aparentemente siempre cuando miro guiones anteriores que había escrito, pero no recordaba correctamente. Primera llamada se pone camino, segunda llamada elimina ruta relativa) (3 editar errata que impedía la respuesta de una sola línea de trabajo, de vuelta a una sola línea fija!)

¿Por qué no se me ocurrió probar esto antes de hacer la pregunta?

THIS_SCRIPT=$(/usr/bin/readlink -nf "$0")

funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top