ghi đè các hàm do người dùng xác định có cùng tên với các lệnh hệ thống


14

Hàm này tồn tại trong một trong những người dùng của tôi '/ / .bashrc:

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

Trong tập lệnh ksh của tôi mà người dùng bắt buộc phải chạy, tôi có một dòng như thế này:

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

Trong khi dấu gạch chéo ngược thoát khỏi các bí danh do người dùng định nghĩa, nó không ngăn tập lệnh chạy các hàm do người dùng xác định có cùng tên. Kết quả là, hàm rm () của người dùng của tôi được gọi thay vì hàm hệ thống.

Tôi tìm thấy câu hỏi và câu trả lời cho câu hỏi siêu người dùng này , nhưng độ phân giải chỉ áp dụng cho hàm dựng sẵn, không phải lệnh hệ thống.

Điều gì là tốt nhất để thực thi lệnh rm khỏi bị gọi, và không phải là bí danh hoặc chức năng? Tôi phải chỉ định đường dẫn đầy đủ đến rm và mọi lệnh hệ thống mà tôi muốn đảm bảo được thực thi chính xác? Có cách nào tốt hơn?

Câu trả lời:


13

Bạn có thể sử dụng commandđể phá vỡ chức năng tra cứu chức năng bash bình thường.

command rm

Ví dụ không phá hủy:

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

Hoặc, gọi nó bằng cách sử dụng env(thực hiện chương trình đầu tiên với tên đã cho trên $PATHhoặc bằng cách chỉ định đường dẫn đầy đủ.

/usr/bin/env rm
/bin/rm

cảm ơn, "lệnh" chính xác là những gì tôi đang tìm kiếm. Dường như có vẻ khó hiểu khi phải sử dụng cho mọi lệnh hệ thống được thực thi. Tôi đoán cách duy nhất chắc chắn để đảm bảo bạn đang chạy lệnh hệ thống là chỉ định toàn bộ đường dẫn. Tuy nhiên, bạn đang giao dịch với các lệnh nằm trên cùng một đường dẫn qua các phân phối khác nhau theo cách tiếp cận đó.
acm

@acm Như tôi đã viết, bạn cũng có thể đi theo envlộ trình. Ngoài ra, bạn có thể xác định vị trí của mỗi công cụ một lần và lưu nó trong một biến, ví dụ RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;. Bạn cũng có thể thay đổi cách tập lệnh của bạn được thực thi. Thông thường, các hàm và bí danh không được kế thừa, nếu không chúng sẽ phá vỡ các tập lệnh mọi lúc.
Daniel Beck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.