Tôi có một alias
bộ cho rm
lệnh của tôi . Nếu tôi chạy alias
lệnh, đây là những gì tôi nhận được như đầu ra.
alias rm='rm -i'
Bây giờ, khi tôi chạy rm
lệnh, nó hoạt động tốt như mong đợi.
rm ramesh
rm: remove regular empty file `ramesh'? y
Bây giờ, tôi đã học được trên các cuộc gọi hệ thống đang được gọi khi tôi thực hiện một lệnh. Vì vậy, tôi đã biết về strace
lệnh từ đây liệt kê cho tôi các tệp đang được gọi khi tôi thực thi một số lệnh. Lệnh như dưới đây.
strace -ff -e trace=file rm ramesh 2>&1
Lệnh hoạt động hoàn toàn tốt, ngoại trừ việc nó bỏ qua các bí danh mà tôi có tại chỗ cho rm
lệnh của mình . Nó xóa tập tin mà không nhắc người dùng.
Vì vậy, có strace
bỏ qua bí danh như thế này? Nếu vậy tại sao nó lại như vậy?
BIÊN TẬP:
Không chắc chắn, nếu điều này có gì đó để làm nhưng type -a rm
cung cấp cho tôi đầu ra như,
rm is aliased to `rm -i'
rm is /bin/rm
Vì vậy, nó đang xem xét /bin/rm
trong trường hợp này đó là lý do tại sao người dùng không được nhắc trước khi xóa?
strace
một bí danh, bạn phải vào strace
trình bao, thực hiện bí danh. Có một vài phương pháp bạn có thể làm để làm điều đó: strace -p $$ &
hoặc strace bash
hoặc strace sh -c 'rm ramesh'
(ý chí cuối cùng cũng bỏ qua các bí danh, nhưng đối với một lý do hoàn toàn khác nhau.)
strace
không bỏ qua bí danh, bởi vì điều đó sẽ ngụ ý có một cái gì đó để bỏ qua ở nơi đầu tiên. Một bí danh là một tính năng của vỏ.strace
là một chương trình khác nhau, và bên trongstrace
khái niệm bí danh không tồn tại, do đó không có gì để bỏ qua. API được cung cấp bởi kernel để thực thi các chương trình cũng không có khái niệm bí danh, vì vậy không có cách nào shell có thể nói về bước đi về bí danh, ngay cả khi nó muốn.