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)
programming-practices
user-interface
bash
Rohit Agarwal
fuente
fuente
rsync
comporta 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 hablandorsync
).ls -l dir
comporta de manera diferente als -l dir/
sidir
es un enlace simbólico a un directorio.Respuestas:
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.
fuente
dirname
,basename
yreadlink
. Un problema muy común es usarlo${path##*/}
como reemplazo debasename
, pero si la ruta termina con una barra diagonal que devuelve una cadena vacía en lugar del último elemento de ruta.rsync
lo estoy mirando)${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 fiestaDado 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.
es lo mismo que
Entonces su script podría verse así:
y no tiene que preocuparse si el usuario ingresa o no un seguimiento / en la ruta.
fuente
bash
comportamiento, el núcleo lo hace.El difunto Jon Postel tuvo algunos buenos consejos en la sección 3.2 del RFC 760 que se aplica aquí:
fuente
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:
fuente
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.
fuente