Jawaban ini mengasumsikan bahwa $1
diizinkan untuk memasukkan subdirektori. Jika Anda tertarik pada kasus yang lebih sederhana di mana $1
seharusnya menjadi nama direktori sederhana, maka lihat salah satu jawaban lainnya.
Wildcard tidak diperluas ketika dalam tanda kutip ganda. Karena $1
dalam tanda kutip ganda, wildcard tidak menjadi masalah.
Keduanya ../
dan symlink dapat mengaburkan lokasi sebenarnya dari suatu file. Yang ditunjukkan di bawah ini adalah tes untuk menentukan apakah file tersebut benar-benar, tidak hanya tampaknya, di bawah jalur yang kita inginkan.
Sistem yang lebih baru: menggunakan realpath
Adapun untuk mengetahui apakah file tersebut benar-benar jika file tersebut benar-benar di bawah /home/charlesingalls/
atau tidak, Anda dapat menggunakan realpath
:
realpath --relative-base=/home/charlesingalls/ "/home/charlesingalls/$1" | grep -q '^/' && exit 1
Di atas berjalan exit 1
jika file yang ditentukan oleh $1
mana saja selain di bawah direktori /home/charlesingalls/
. realpath
mengkanonik seluruh jalur, menghilangkan symlink dan ../
.
realpath
adalah bagian dari GNU coreutils dan harus tersedia di sistem Linux apa pun.
realpath
membutuhkan GNU coreutils 8.15 (Jan 2012) atau lebih baik .
Contohnya
Untuk mendemonstrasikan bagaimana realpath mengikuti ../
untuk menentukan lokasi sebenarnya dari suatu file (misalnya, -q
opsi untuk grep dihilangkan sehingga output aktual dari grep terlihat):
$ touch /tmp/test
$ realpath --relative-base=$HOME "$HOME/../../tmp/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Untuk mendemonstrasikan cara mengikuti symlinks:
$ ln -s /tmp/test ~/test
$ realpath --relative-base=$HOME "$HOME/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Sistem yang lebih lama: menggunakan readlink -e
readlink
juga mampu mengkononisasi jalur, mengikuti kedua symlinks dan ../
:
readlink -e "$HOME/test" | grep -q "^$HOME" || exit 1
Menggunakan contoh file yang sama:
$ readlink -e "$HOME/../../tmp/test" | grep "$HOME" || echo FAIL
FAIL
$ readlink -e "$HOME/test" | grep "^$HOME" || echo FAIL
FAIL
Selain tersedia di sistem GNU yang lebih lama, versi readlink
tersedia di BSD.
/
. Wildcard tidak ditafsirkan dalam kutipan.