¿Es una buena práctica requerir una barra diagonal final en los nombres de directorio?

9

Quiero pedirle al usuario de mi script bash que pase una ruta de directorio como argumento. ¿Cuál de las siguientes es una buena práctica de programación?

  • Requerir que el usuario ingrese un final / / barra inclinada
  • Requerir que un usuario no ingrese un final / (barra inclinada)
Rohit Agarwal
fuente
3
Tenga en cuenta que se rsynccomporta de manera diferente de una manera muy importante dependiendo de la presencia de arrastre /, por lo que en algunos casos querrá normalizar la coherencia, y en otros deseará pasar limpiamente para implementar lo que el usuario dijo (si Sabía que estaban hablando rsync).
sh1
Otra que me sorprendió recientemente es que se ls -l dircomporta de manera diferente a ls -l dir/si dires un enlace simbólico a un directorio.
Flimm

Respuestas:

27

La mejor práctica es asumir que ninguno.

Si tiene acceso a las utilidades / clases del generador de rutas, utilícelas, si no, escriba su código para aceptar cualquiera de los formatos y actuar en consecuencia.

Nada es más molesto para el usuario que tener que recordar si agregar una barra inclinada final o no.

ChrisF
fuente
66
Corolario: analice siempre las rutas con las herramientas de línea de comandos adecuadas dirname, basenamey readlink. Un problema muy común es usarlo ${path##*/}como reemplazo de basename, pero si la ruta termina con una barra diagonal que devuelve una cadena vacía en lugar del último elemento de ruta.
l0b0
1
+1 por usar clases de utilidad. No puedo decir cuántas veces he visto a los desarrolladores reinventar la rueda cuando se trata de ensamblar rutas, cuando la mayoría de los marcos pueden hacerlo fácilmente hoy en día.
RationalGeek
1
Además, estoy muy molesto cuando alguna aplicación me obliga a hacer esto de una manera específica. Y a veces el usuario no puede controlar cómo escribir esa ruta: a veces lo escriben, así que sí, eligen escribir con o sin barra inclinada final, pero en los casos en que el usuario completa automáticamente con TAB, muchos shells colocan la barra inclinada final, entonces, ¿requeriría que el usuario lo elimine? Y aún más molesto es cuando una aplicación se comporta de manera diferente si coloca la barra diagonal final en un directorio pasado como argumento ( rsynclo estoy mirando)
Carlos Campderrós
Recientemente necesité verificar una barra diagonal de la entrada del usuario para usar con rsync (ya que es sensible a estas cosas). Como señaló @ChrisF, es una buena práctica asumir que ninguno de los dos. Se me ocurrió lo siguiente como una forma elegante de no suponer ninguno de los dos: ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))también lo documenté de manera esencial para mayor claridad: agregue o elimine la barra inclinada en la fiesta
John Mark Mitchell
10

Dado que bash ignora las barras inclinadas múltiples, puede asumir con seguridad que el usuario no ingresó una barra inclinada final en la ruta y agregar una barra usted mismo.

cat /etc/hosts

es lo mismo que

cat /////etc//////////hosts

Entonces su script podría verse así:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

y no tiene que preocuparse si el usuario ingresa o no un seguimiento / en la ruta.

usuario281377
fuente
55
Nit: Eso no es bashcomportamiento, el núcleo lo hace.
Blrfl
7

El difunto Jon Postel tuvo algunos buenos consejos en la sección 3.2 del RFC 760 que se aplica aquí:

En general, una implementación debe ser conservadora en su comportamiento de envío y liberal en su comportamiento de recepción. Es decir, debe tener cuidado al enviar datagramas bien formados, pero debe aceptar cualquier datagrama que pueda interpretar (p. Ej., No objetar errores técnicos donde el significado aún es claro).

Blrfl
fuente
3

Conceptualmente, la barra diagonal no es parte del nombre. La barra diagonal es solo un delimitador entre nombres. Mi home-dir es / home / stefan y no / home / stefan /.

Si no espera una barra inclinada final, no fallará si la hay, como ya se dijo en ammoQ. Pero puede pegar fácilmente nombres y variables, ya que no tiene que citar la barra:

a="/home"
b="stefan"

dir=$a/$b
usuario desconocido
fuente
0

Exigir que el directorio no debe tener una barra inclinada final sería extremadamente molesto para el uso interactivo en la consola: la finalización automática con TAB agrega automáticamente una barra inclinada final para los directorios.

Por lo tanto, debe permitir que los directorios se especifiquen con una barra diagonal final.

oberlies
fuente