mengganti fungsi yang ditentukan pengguna dengan nama yang sama dengan perintah sistem

14

Fungsi ini ada di salah satu pengguna saya ~ / .bashrc:

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

Dalam skrip ksh saya yang harus dijalankan oleh pengguna, saya memiliki baris seperti ini:

[[ "$KEEP" = "" ]] && \rm $FILE

Meskipun backslash lolos dari alias yang ditentukan pengguna, itu tidak menghentikan skrip dari menjalankan fungsi yang ditentukan pengguna dengan nama yang sama. Akibatnya, fungsi rm () pengguna saya dipanggil alih-alih fungsi sistem.

Saya menemukan ini pertanyaan superuser pertanyaan & respon, tetapi resolusi hanya berlaku untuk fungsi builtin, bukan perintah sistem.

Apa yang terbaik untuk menegakkan perintah rm agar tidak dipanggil, dan bukan alias atau fungsi? Haruskah saya menentukan path lengkap ke rm dan setiap perintah sistem yang ingin saya pastikan dijalankan dengan benar? Apakah ada cara yang lebih baik?

acm
sumber

Jawaban:

13

Anda dapat menggunakan commanduntuk menghindari pencarian fungsi bash normal.

command rm

Contoh non-destruktif:

$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which

Atau, panggil menggunakan env(menjalankan program pertama dengan nama yang diberikan pada $PATH, atau dengan menentukan path lengkap.

/usr/bin/env rm
/bin/rm
Daniel Beck
sumber
terima kasih, "perintah" adalah persis apa yang saya cari. Sepertinya agak tumpul harus menggunakan untuk setiap perintah sistem yang dijalankan. Saya kira satu-satunya cara yang pasti untuk memastikan Anda menjalankan perintah sistem adalah menentukan keseluruhan jalur. Namun, Anda mengandalkan perintah yang berada di jalur yang sama di berbagai distro yang berbeda dengan pendekatan itu.
acm
@acm Seperti yang saya tulis, Anda juga bisa pergi envrute. Selain itu, Anda dapat menentukan lokasi setiap alat sekali dan menyimpannya dalam variabel, misalnya RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Anda juga dapat mengubah cara skrip Anda dijalankan. Biasanya, fungsi dan alias tidak diwariskan, jika tidak mereka akan merusak skrip setiap saat.
Daniel Beck