Ada pertanyaan serupa yang berhubungan dengan skenario 'pembungkus', di mana Anda ingin mengganti misalnya cd
dengan 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 cd
dari skrip saya.
Pertimbangkan ini
cd() { echo "muahaha"; }
export -f cd
Setiap skrip yang dipanggil dalam lingkungan ini menggunakan cd
akan 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 ( builtin
dan 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.
env
tidak 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/sh
jika ini bukan shell interaktif bawaan.
env
perintah sebelumnya, seperti ini:env -i <SCRIPT.sh>