Các [
lệnh là để đánh giá biểu thức điều kiện. Nó không được sử dụng ở đây.
Bởi vì umount
không xuất ra bất cứ thứ gì trên đầu ra tiêu chuẩn của nó (các lỗi chuyển sang stderr), `sudo umount mount`
mở rộng thành không có gì.
Vì vậy, nó giống như:
while [ ]
do
sleep 0.1
done
Các [
lệnh, khi không được thông qua bất kỳ đối số bên cạnh [
và ]
lợi nhuận sai (một trạng thái thoát khác không), vì vậy bạn sẽ không tham gia các vòng lặp.
Ngay cả khi umount
có lỗi xuất ra trên thiết bị xuất chuẩn, sử dụng [
lệnh sẽ không có ý nghĩa, bởi vì các từ kết quả của đầu ra đó sẽ không bao giờ tạo thành một biểu thức điều kiện hợp lệ.
Ở đây bạn muốn:
until sudo umount mount
do
sleep 0.1
done
Đó là, bạn muốn kiểm tra trạng thái thoát của sudo / umount, không phải của [
lệnh.
Nếu bạn muốn kiểm tra xem umount
đầu ra có bất kỳ lỗi hoặc cảnh báo nào trên thiết bị lỗi chuẩn hay không, đó là nơi [
có thể hữu ích. Đây -n "some-string"
là một biểu thức có điều kiện được [
lệnh nhận ra để kiểm tra xem "some-string"
có trống hay không, vì vậy một cái gì đó như:
while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
sleep 0.1
done
Nhưng tìm kiếm sự hiện diện của thông báo lỗi hoặc cảnh báo nói chung là một ý tưởng tồi. Các umount
lệnh cho chúng ta hay không thành công với mã lối ra của nó, đó là đáng tin cậy hơn. Nó có thể thành công và vẫn đưa ra một số thông điệp cảnh báo. Nó có thể thất bại và không xuất ra lỗi (như khi nó bị giết).
Trong trường hợp cụ thể này, lưu ý rằng umount
có thể thất bại vì thư mục không được gắn kết và bạn sẽ lặp lại mãi mãi trong trường hợp đó, vì vậy bạn có thể thử một cách tiếp cận khác như:
while mountpoint -q mount && ! sudo umount mount; do
sleep 0.1
done
Hoặc nếu "mount" có thể được gắn nhiều lần và bạn muốn ngắt kết nối tất cả chúng:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done