Questa risposta presuppone che $1sia consentito includere le sottodirectory. Se sei interessato al caso più semplice in cui $1dovrebbe esserci un semplice nome di directory, vedi una delle altre risposte.
I caratteri jolly non vengono espansi tra virgolette doppie. Dato che $1è tra virgolette, i caratteri jolly non sono un problema.
Entrambi ../e i collegamenti simbolici possono oscurare la posizione reale di un file. Di seguito sono mostrati i test per determinare se il file si trova davvero, non solo apparentemente, nel percorso desiderato.
Sistemi più recenti: utilizzo realpath
Per sapere se il file è realmente se il file è davvero sotto /home/charlesingalls/o no, puoi usare realpath:
realpath --relative-base=/home/charlesingalls/ "/home/charlesingalls/$1" | grep -q '^/' && exit 1
Quanto sopra viene eseguito exit 1se il file specificato da si $1trova in un punto diverso dalla directory /home/charlesingalls/. realpathcanonicalizza l'intero percorso, eliminando sia i symlink che i ../.
realpath fa parte dei coreutils GNU e dovrebbe essere disponibile su qualsiasi sistema Linux.
realpathrichiede GNU coreutils 8.15 (gennaio 2012) o superiore .
Esempi
Per dimostrare come segue realpath ../per determinare la posizione reale di un file (ad esempio, l' -qopzione grep è omessa in modo che sia visibile l'output effettivo di grep):
$ touch /tmp/test
$ realpath --relative-base=$HOME "$HOME/../../tmp/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Per dimostrare come segue i collegamenti simbolici:
$ ln -s /tmp/test ~/test
$ realpath --relative-base=$HOME "$HOME/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Sistemi meno recenti: utilizzo readlink -e
readlinkè anche in grado di cononicalizzare un percorso, seguendo entrambi i link simbolici e ../:
readlink -e "$HOME/test" | grep -q "^$HOME" || exit 1
Utilizzando gli stessi file di esempio:
$ readlink -e "$HOME/../../tmp/test" | grep "$HOME" || echo FAIL
FAIL
$ readlink -e "$HOME/test" | grep "^$HOME" || echo FAIL
FAIL
Oltre ad essere disponibili su sistemi GNU precedenti, le versioni di readlinksono disponibili su BSD.
/. I caratteri jolly non vengono interpretati tra virgolette.