Tengo el script Perl y necesito determinar la ruta completa y el nombre del archivo durante la ejecución. Descubrí que, dependiendo de cómo llames, el script $0
varía y, a veces, contiene el fullpath+filename
y, a veces, solo filename
. Debido a que el directorio de trabajo también puede variar, no puedo pensar en una forma de obtener de manera confiable fullpath+filename
el script.
¿Alguien tiene una solución?
__FILE__
) no funciona como se esperaba? Termino con la ruta relativa desde donde se ejecutó el script, mientras que la respuesta aceptada me da la ruta absoluta completa.dirname(__FILE__)
no sigue los enlaces simbólicos, por lo que si vinculó el archivo ejecutable y esperaba encontrar la ubicación de algún otro archivo en la ubicación de instalación, debe verificarloif( -l __FILE__)
y luegodirname(readlink(__FILE__))
.perl -e 'use Module::CoreList; print Module::CoreList->first_release("File::Basename");'; echo
. ParaFile::Basename
eso fue Perl 5.0.0, que se lanzó a finales de los 90, creo que ahora es seguro usarlo.$ 0 suele ser el nombre de su programa, entonces, ¿qué tal esto?
Me parece que esto debería funcionar como abs_path sabe si está utilizando una ruta relativa o absoluta.
Actualización Para cualquiera que lea esto años después, debería leer la respuesta de Drew . Es mucho mejor que el mío.
fuente
realpath
, que es sinónimo deabs_path
, en caso de que prefiera el nombre sin guión bajoperl -e 'use Cwd "abs_path";print abs_path($0);'
impresiones/tmp/-e
-e
), creo que Perl crea un archivo temporal para almacenar su script en línea. Parece que la ubicación, en su caso, es/tmp
. ¿Cuál esperaba que fuera el resultado?http://perldoc.perl.org/File/Spec/Unix.html
fuente
Creo que el módulo que estás buscando es FindBin:
fuente
Puede usar FindBin , Cwd , File :: Basename o una combinación de ellos. Todos están en la distribución base de Perl IIRC.
Usé Cwd en el pasado:
Cwd:
fuente
Obtener el camino absoluto hacia
$0
o__FILE__
es lo que quieres. El único problema es que si alguien hizo unchdir()
y$0
fue relativo, entonces necesita obtener el camino absoluto en unBEGIN{}
para evitar sorpresas.FindBin
intenta ir uno mejor y arrastrarse$PATH
por algo que coincida con elbasename($0)
, pero hay momentos en que eso hace cosas demasiado sorprendentes (específicamente: cuando el archivo está "justo frente a ti" en el cwd).File::Fu
tieneFile::Fu->program_name
yFile::Fu->program_dir
para esto.fuente
chdir()
en tiempo de compilación?Algunos antecedentes breves:
Desafortunadamente, la API de Unix no proporciona un programa en ejecución con la ruta completa al ejecutable. De hecho, el programa que ejecuta el suyo puede proporcionar lo que quiera en el campo que normalmente le dice a su programa qué es. Hay, como señalan todas las respuestas, varias heurísticas para encontrar posibles candidatos. Pero nada menos que buscar en todo el sistema de archivos siempre funcionará, e incluso eso fallará si el ejecutable se mueve o se elimina.
Pero no desea el ejecutable de Perl, que es lo que realmente se está ejecutando, sino el script que está ejecutando. Y Perl necesita saber dónde está el guión para encontrarlo. Almacena esto
__FILE__
, mientras que$0
es de la API de Unix. Esto todavía puede ser un camino relativo, así que tome la sugerencia de Mark y canonícela conFile::Spec->rel2abs( __FILE__ );
fuente
__FILE__
Todavía me da un camino relativo. es decir '.'Has probado:
o
Realmente depende de cómo se llame y si es CGI o si se ejecuta desde un shell normal, etc.
fuente
Para obtener la ruta al directorio que contiene mi script, ya utilicé una combinación de respuestas.
fuente
perlfaq8 responde una pregunta muy similar al usar la
rel2abs()
función on$0
. Esa función se puede encontrar en File :: Spec.fuente
No es necesario usar módulos externos, con solo una línea puede tener el nombre del archivo y la ruta relativa. Si está utilizando módulos y necesita aplicar una ruta relativa al directorio del script, la ruta relativa es suficiente.
fuente
: DD
fuente
¿Estás buscando esto ?:
La salida se verá así:
Funciona tanto en Windows como en Unix.
fuente
fuente
El problema con
__FILE__
es que imprimirá la ruta principal del módulo ".pm", no necesariamente la ruta del script ".cgi" o ".pl" que se está ejecutando. Supongo que depende de cuál sea tu objetivo.Me parece que
Cwd
solo necesita actualizarse para mod_perl. Aquí está mi sugerencia:Por favor agregue cualquier sugerencia.
fuente
Sin ningún módulo externo, válido para shell, funciona bien incluso con '../':
prueba:
fuente
El problema con solo usar
dirname(__FILE__)
es que no sigue enlaces simbólicos. Tuve que usar esto para que mi script siguiera el enlace simbólico a la ubicación real del archivo.fuente
Todas las soluciones sin biblioteca en realidad no funcionan para más de unas pocas formas de escribir una ruta (piense ../ o /bla/x/../bin/./x/../ etc. Mi solución se parece a a continuación. Tengo una peculiaridad: no tengo la menor idea de por qué tengo que ejecutar los reemplazos dos veces. Si no lo hago, obtengo un "./" o "../" falso. Aparte de eso, me parece bastante robusto
fuente
Ninguna de las respuestas "principales" fue adecuada para mí. El problema con el uso de FindBin '$ Bin' o Cwd es que devuelven la ruta absoluta con todos los enlaces simbólicos resueltos. En mi caso, necesitaba la ruta exacta con enlaces simbólicos presentes, lo mismo que devuelve el comando Unix "pwd" y no "pwd -P". La siguiente función proporciona la solución:
fuente
En Windows, usar
dirname
yabs_path
juntos funcionó mejor para mí.este es el por qué:
fuente
¿Qué tiene de malo
$^X
?Le daría la ruta completa al binario de Perl que se está utilizando.
Evert
fuente
En * nix, es probable que tenga el comando "whereis", que busca en su $ PATH buscando un binario con un nombre de pila. Si $ 0 no contiene el nombre completo de la ruta, ejecutar whereis $ scriptname y guardar el resultado en una variable debería indicarle dónde se encuentra el script.
fuente