Hoy cuando escribo mi script de shell.
Una pregunta de repente viene a mi mente.
Desde cd /target_dir
y cd /target_dir/
ambas obras.
¿Debo agregar una barra diagonal al final de mis variables de ruta en un script de shell?
Tal como LOG_PATH=/data/nginx/logs
versus LOG_PATH=/data/nginx/logs/
.
Hice una búsqueda general en google, pero no encontré discusión sobre esto, ¿tal vez es demasiado básico?
Por ahora, es realmente difícil para mí decidir qué estilo elegir.
Pero preferí el LOG_PATH=/target_dir/
estilo un poco más.
Porque cuando estoy haciendo autocompletar con bash, me muestra el resultado con una barra diagonal.
¿Cuál es tu opinión sobre esto, por qué?
shell
shell-script
zen
fuente
fuente
Respuestas:
De acuerdo con POSIX:
fuente
//
y/
con su nombre mostrar de manera diferente en el indicador de bash, y usando sepwd
mostrará una ruta diferente, pero su contenido es idéntico. ¿Por qué?bash
rastrea el directorio actual de una manera muy ingenua, como una cadena. Simplemente se agrega y elimina de la ruta heurísticamente, no se vincula al sistema de archivos real. Una consecuencia es que puede crear un CD en un enlace simbólico y volver de la misma manera (si bash no decidió que era demasiado y lo reinicializó). El otro es lo que usted describe. No debe confiar en el seguimiento del shell del directorio actual, no es confiable.Para estar seguro, incluya la barra oblicua. Esto puede conducir a múltiples barras al concatenar los caminos, pero al menos evita problemas.
Algunos ejemplos:
rsync
trata las rutas de manera diferente si se incluye la barra diagonal final (sincroniza ese directorio en lugar de crear otro subdirectorio). Los enlaces simbólicos a directorios a veces se comportan de manera inesperada cuando no tienen la barra diagonal final; al menos, la finalización del shell se confunde. Nunca se sabe si el comando / secuencia de comandos que invocas se basa en la comprobación de la barra para un comportamiento especial. Incluso podría salvarte de sobrescribir algo. Por ejemplo, si tiene un archivo llamadofoo
, pero cree erróneamente que es un directorio y desea mover algo en él,mv bar foo
sobrescribirá el archivo (pérdida de datos, posible catástrofe) peromv bar foo/
simplemente se quejará y no hará nada.Para concluir, en la mayoría de los casos no importa, pero debe usar la barra oblicua para protegerse y también para que sea más obvio para el lector humano lo que pretendía hacer en un guión. Un observador casual se asegurará de inmediato de que una variable se refiera a un directorio si termina con una barra oblicua, y la usará correctamente si necesita ser modificada.
fuente
No, no deberías. Agrega una barra extra innecesaria (
/
).ejemplo
digamos que desea exportar el
bin
directorio de java a suPATH
variable,export PATH=$PATH:/opt/jre1.7.0_45/bin/
ahora compruébalo,
observe la barra oblicua adicional (
/
) antes de Java, pero afortunadamente solo funciona en tal caso.fuente