¿Deberían los scripts de shell funcionar en rutas absolutas o relativas?

¿Deberían los scripts de shell funcionar en rutas absolutas o relativas?

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 cdun guión, pero debe hacerse con moderación. Varias llamadas a cdson un "olor a código". Generalmente son preferibles los caminos absolutos.

cdpuede 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 PWDsiempre contiene el directorio actual, por lo que puede guardarla en otra variable y volver a cambiarla llamándola cdmá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.

información relacionada