Questa risposta presuppone che $1
sia consentito includere le sottodirectory. Se sei interessato al caso più semplice in cui $1
dovrebbe 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 1
se il file specificato da si $1
trova in un punto diverso dalla directory /home/charlesingalls/
. realpath
canonicalizza l'intero percorso, eliminando sia i symlink che i ../
.
realpath
fa parte dei coreutils GNU e dovrebbe essere disponibile su qualsiasi sistema Linux.
realpath
richiede 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' -q
opzione 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 readlink
sono disponibili su BSD.
/
. I caratteri jolly non vengono interpretati tra virgolette.