Estoy en el proceso de convertir algunos scripts por lotes en scripts de shell. Los scripts por lotes tienen comandos cd pero aún usan rutas absolutas.
foo.bat:
pushd
cd C:\some\directory
copy C:\some\directory\foo.txt C:\some\other\directory
popd
Creo que el cd en este script es redundante ya que el archivo que se está copiando se llama mediante rutas absolutas. Necesito convertir esto a un script de shell. Tengo las siguientes dos opciones:
prueba1.sh:
cp /some/directory/foo.txt /some/other/directory
prueba2.sh:
cd /some/directory
cp foo.txt /some/other/directory
Este primero usa solo cp con rutas absolutas y el segundo usa cd y rutas relativas.
Mi pregunta es: ¿Cuál de estos dos ejemplos es la mejor práctica en términos de uso de rutas en scripts de Shell?
Como pregunta paralela, ¿se necesita pushd/popd en alguno de estos ejemplos?
Respuesta1
No es necesariamente malo solicitar cd
un guión, pero debe hacerse con moderación. Varias llamadas a cd
son un "olor a código". Generalmente son preferibles los caminos absolutos.
cd
puede fallar. Asegúrese de manejar los errores correctamente.
Después de una llamada a cd
, las rutas relativas dejan de ser válidas. En particular, si está escribiendo un script contenedor que prepara algunas cosas y luego ejecuta otro comando, nunca llame cd
: el usuario puede confiar en que el comando se ejecuta en el directorio original. Si su secuencia de comandos utiliza nombres de archivos pasados en la línea de comando, normalmente son relativos al directorio original; puede anteponerlos "$PWD/"
para hacerlos absolutos, pero eso generará mensajes de error deficientes si algo sale mal.
La variable PWD
siempre contiene el directorio actual, por lo que puede guardarla en otra variable y volver a cambiarla llamándola cd
más tarde. Sin embargo, tenga en cuenta que esto puede fallar en algunos casos extremos, como un script que se ejecuta con privilegios bajos y al que no se le permite volver a su directorio original, o un directorio que se mueve mientras se ejecuta el script.
Tenga cuidado con las rutas relativas: pueden comenzar con -
y los argumentos de comando que comienzan con -
se interpretan como opciones si no se toman precauciones. Los caminos absolutos no tienen este problema.
Respuesta2
Por lo que yo he experimentado, depende principalmente de tus necesidades y preferencias.
Encontrarás muchos documentos en los que esto se deja en manos del usuario. Esto es lo que noté:
- las rutas absolutas son más claras: quién tendrá que mantener/modificar su script (usted u otros) podrá saber en todo momento qué directorios están involucrados;
- con rutas absolutas, está seguro de que los directorios involucrados son los que tienen la ruta exacta que está escribiendo en el script;
- las rutas relativas son más cortas, pero debes estar seguro del subárbol en el que estás trabajando;
- puede lograr brevedad reemplazando las rutas recurrentes con una variable al comienzo del script (por ejemplo, /var/log/app/component/module/logfile.log -> $module_log_dir/logfile.log)
Como notó Thrig, puede agregar una verificación de los directorios involucrados justo antes de ejecutar el comando.