Thực thi lệnh mail từ bên trong một chức năng gây ra một vụ đánh bom ngã ba


8

Khi tôi cố gắng thực thi mailtừ bên trong một hàm trong tập lệnh bash, nó sẽ tạo ra thứ gì đó tương tự như một quả bom ngã ba. Để làm rõ, điều này tạo ra vấn đề:

#!/bin/bash

mail() {
    echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org"
}

mail

exit 0

Đôi khi bạn có thể giết lệnh và nó sẽ giết các tiến trình con, nhưng đôi khi bạn sẽ phải thực hiện killall -9.

Nó không quan tâm liệu thư đã được gửi hay chưa. Các quả bom ngã ba được tạo ra một trong hai cách. Và dường như không thêm bất kỳ kiểm tra nào cho mã thoát, chẳng hạn như if ! [ "$?" = 0 ], giúp.

Nhưng đoạn script bên dưới hoạt động như dự định, nó sẽ xuất ra lỗi hoặc nó sẽ gửi thư.

#!/bin/bash

echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org"

exit 0

Lý do tại sao điều này xảy ra? Và làm thế nào bạn sẽ kiểm tra mã thoát của lệnh mail?


10
Nó được gọi là đệ quy.
Jakuje

Câu trả lời:


29

Bạn đang gọi hàm mail từ trong cùng một hàm:

#!/bin/bash

mail() {
    # This actually calls the "mail" function
    # and not the "mail" executable
    echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org"
}


mail

exit 0

Điều này sẽ làm việc:

#!/bin/bash

mailfunc() {
    echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org"
}

mailfunc

exit 0

Lưu ý rằng tên hàm không còn được gọi từ bên trong hàm.


3
Xảy ra với những điều tốt nhất của chúng ta, người đàn ông.
Almo

15

Nếu không thì:

mail(){

    echo olly olly oxenfree | command mail -s 'and the rest' and@more
}

... nên hoạt động tốt.


7
Có lẽ nhấn mạnh commandmột phần, như đối với giáo dân, thật khó để nhận thấy sự thay đổi cùng với olly olly oxenfree'and the rest' and@morethay đổi, đặc biệt là với việc tô sáng cú pháp.
wizzwizz4

1
@ wizzwizz4 - Tôi ủng hộ nhận xét này.
mikeerv

1
Đó mặc dù buồn cười ...
wizzwizz4

3

Giải pháp "truyền thống" nhất trong những trường hợp này thực sự là gọi lệnh với đường dẫn đầy đủ:

mail() {
    echo "Free of oxens" | /usr/bin/mail -s "Do you want to play chicken with the void?" "example@example.org"
}

Tất cả các câu trả lời khác đều hoạt động, và có lẽ dễ mang theo hơn, nhưng tôi nghĩ rằng đây là giải pháp rất có thể bạn tìm thấy trong các kịch bản trong thế giới thực hoang dã, vì vậy tôi bao gồm nó để hoàn thiện.


3
Thật vậy, tôi không quen gửi thư trong / usr / bin.
Joshua

3
@Joshua, có vẻ như nó đã có trên OS X. Trong CentOS 6 /bin/mail. Tôi nghĩ rằng điều này chứng minh giá trị của command mailcú pháp.
tự đại diện

Arch Linux cũng có điều này /usrbởi vì mô hình của họ là di chuyển tất cả các nhị phân vào cùng một thư mục, do đó /binchỉ là một liên kết tượng trưng đến /usr/bin. Vì vậy, vâng ... đây không phải là di động, nhưng nó thường được thấy nhiều hơn command, bằng cách nào đó - đặc biệt là trong các tập lệnh khởi động kế thừa được tạo riêng cho từng bản phân phối, tất cả các đường dẫn tuyệt đối đều được mã hóa cứng (ví dụ: tập lệnh RC trong Slackware).
orion
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.