Tôi biết đó set -e
là bạn của tôi để thoát lỗi. Nhưng phải làm gì nếu tập lệnh có nguồn gốc, ví dụ một hàm được thực thi từ bàn điều khiển? Tôi không muốn đóng giao diện điều khiển do lỗi, tôi chỉ muốn dừng tập lệnh và hiển thị thông báo lỗi.
Tôi có cần kiểm tra $ không? của mỗi lệnh bằng tay để làm cho điều đó có thể?
Dưới đây là một kịch bản ví dụ myScript.sh
để hiển thị vấn đề:
#!/bin/sh
set -e
copySomeStuff()
{
source="$1"
dest="$2"
cp -rt "$source" "$dest"
return 0
}
installStuff()
{
dest="$1"
copySomeStuff dir1 "$dest"
copySomeStuff dir2 "$dest"
copySomeStuff nonExistingDirectory "$dest"
}
Kịch bản được sử dụng như thế:
$ source myScript.sh
$ installStuff
Điều này sẽ chỉ đóng giao diện điều khiển. Các lỗi hiển thị bởi cp
bị mất.
set -e
Đặt errexit
tùy chọn trong trình bao. Khi gọi hàm, cp
lỗi và shell thoát ra cho tôi.
#!
và sẽ áp dụng set -e
cho shell gọi, vì vậy sẽ áp dụng cho tất cả các lệnh tiếp theo.
()
khi gọi các hàm shell.
${dest}
và ${source}
vẫn không được trích dẫn, và chúng chứa đầu vào của người dùng. Tôi hơi khó tính với bạn ở đây, nhưng bạn cần trích dẫn chúng trong tập lệnh của mình trên máy hoặc những việc đơn giản như sao chép tệp có khoảng trắng trong tên của chúng sẽ không hoạt động. Lấy làm tiếc. Tôi chỉ đang cố gắng đưa ra phản hồi mang tính xây dựng.
cp
lỗi và thoát với 1 mã thoát.