Esta respuesta supone que $1está permitido incluir subdirectorios. Si está interesado en el caso más simple donde $1debería ser un nombre de directorio simple, consulte una de las otras respuestas.
Los comodines no se expanden entre comillas dobles. Como $1está entre comillas dobles, los comodines no son un problema.
Ambos ../y los enlaces simbólicos pueden ocultar la ubicación real de un archivo. A continuación se muestran pruebas para determinar si el archivo está realmente, no solo aparentemente, bajo la ruta que queremos.
Sistemas más nuevos: usando realpath
En cuanto a averiguar si el archivo es realmente si el archivo está realmente bajo /home/charlesingalls/o no, puede usar realpath:
realpath --relative-base=/home/charlesingalls/ "/home/charlesingalls/$1" | grep -q '^/' && exit 1
Lo anterior se ejecuta exit 1si el archivo especificado por $1está en otro lugar que no sea el directorio /home/charlesingalls/. realpathcanonicaliza todo el camino, eliminando enlaces simbólicos y ../.
realpath es parte de GNU coreutils y debería estar disponible en cualquier sistema Linux.
realpathrequiere GNU coreutils 8.15 (enero de 2012) o superior .
Ejemplos
Para demostrar cómo sigue realpath ../para determinar la ubicación real de un archivo (por ejemplo, -qse omite la opción de grep para que la salida real de grep sea visible):
$ touch /tmp/test
$ realpath --relative-base=$HOME "$HOME/../../tmp/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Para demostrar cómo sigue los enlaces simbólicos:
$ ln -s /tmp/test ~/test
$ realpath --relative-base=$HOME "$HOME/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Sistemas más antiguos: utilizando readlink -e
readlinktambién es capaz de cononicalizar una ruta, siguiendo enlaces simbólicos y ../:
readlink -e "$HOME/test" | grep -q "^$HOME" || exit 1
Usando los mismos archivos de ejemplo:
$ readlink -e "$HOME/../../tmp/test" | grep "$HOME" || echo FAIL
FAIL
$ readlink -e "$HOME/test" | grep "^$HOME" || echo FAIL
FAIL
Además de estar disponibles en sistemas GNU más antiguos, hay versiones de readlinkBSD disponibles.
/. Los comodines no se interpretan entre comillas.