Như những người khác đã nói, đây là bởi vì stdin
của sh
đã được chuyển đến đọc từ đường ống, nó không phải là kết nối với thiết bị đầu cuối vì nó sẽ bình thường được. Một điều bạn có thể làm để giải quyết vấn đề này là sử dụng /dev/tty
để buộc tập lệnh đọc từ thiết bị đầu cuối. Ví dụ:
#!/bin/sh
read -p "Are you sure [Y/n]?" line </dev/tty
case "$line" in
y|Y) echo "confirmed"
;;
*) echo "not confirmed"
;;
esac
Thông thường bạn sẽ chỉ làm điều này nếu bạn đặc biệt muốn ngăn mọi người viết kịch bản đầu vào, ví dụ:
echo Y | sh confirmation.sh
Điều này vẫn sẽ đọc từ thiết bị đầu cuối mặc dù người dùng có thể mong đợi điều này sẽ tự động nhập Y
tại dấu nhắc. Nó là phổ biến cho các chương trình mong đợi một mật khẩu để làm điều này.
/bin/bash
trong dòng bang, nhưng bạn sử dụng một.sh
phần mở rộng và cố gắng chuyển tập lệnh sangsh
. Không phải là một vấn đề vì mã bạn có tương thích với cả hai, nhưng đáng để chỉ ra.