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?

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.