Ada pertanyaan serupa yang berhubungan dengan skenario 'pembungkus', di mana Anda ingin mengganti misalnya cddengan perintah yang memanggil builtin cd.
Namun, mengingat shellshock et al dan mengetahui bahwa bash mengimpor fungsi dari lingkungan, saya telah melakukan beberapa tes dan saya tidak dapat menemukan cara untuk memanggil buildin dengan aman cddari skrip saya.
Pertimbangkan ini
cd() { echo "muahaha"; }
export -f cd
Setiap skrip yang dipanggil dalam lingkungan ini menggunakan cdakan rusak (pertimbangkan efek dari sesuatu seperti cd dir && rm -rf .).
Ada perintah untuk memeriksa jenis perintah (mudah dipanggil type) dan perintah untuk mengeksekusi versi builtin daripada fungsi ( builtindan command). Tapi, lihat dan lihat, ini bisa diganti menggunakan fungsi juga
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Akan menghasilkan yang berikut:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Apakah ada cara untuk memaksa bash secara aman untuk menggunakan perintah builtin, atau setidaknya mendeteksi bahwa suatu perintah bukanlah builtin, tanpa membersihkan seluruh lingkungan?
Saya menyadari jika seseorang mengendalikan lingkungan Anda, Anda mungkin masih bisa mengacaukannya, tetapi setidaknya untuk alias Anda punya opsi untuk tidak memanggil alias dengan menyisipkan \sebelumnya.
envtidak didefinisikan ulang sebagai suatu fungsi juga. Ini menakutkan. Saya pertama kali berpikir bahwa karakter khusus akan membantu - memanggil dengan path lengkap yang mencakup /, menggunakan .sumber, dan sebagainya. Tapi itu juga bisa digunakan untuk nama fungsi! Anda dapat mendefinisikan kembali fungsi yang Anda inginkan, tetapi sulit untuk kembali memanggil perintah asli.
#/bin/shjika ini bukan shell interaktif bawaan.
envperintah sebelumnya, seperti ini:env -i <SCRIPT.sh>