Làm cách nào để dừng tập lệnh bash cho đến khi người dùng nhấn Space?
Tôi muốn có câu hỏi trong kịch bản của tôi
Nhấn phím cách để tiếp tục hoặc CTRL+ Cđể thoát
và sau đó tập lệnh sẽ dừng lại và đợi cho đến khi Space được nhấn.
Làm cách nào để dừng tập lệnh bash cho đến khi người dùng nhấn Space?
Tôi muốn có câu hỏi trong kịch bản của tôi
Nhấn phím cách để tiếp tục hoặc CTRL+ Cđể thoát
và sau đó tập lệnh sẽ dừng lại và đợi cho đến khi Space được nhấn.
Câu trả lời:
Bạn có thể sử dụng read
:
read -n1 -r -p "Press space to continue..." key
if [ "$key" = '' ]; then
# Space pressed, do something
# echo [$key] is empty when SPACE is pressed # uncomment to trace
else
# Anything else pressed, do whatever else.
# echo [$key] not empty
fi
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
Khối luôn chạy, ngay cả khi nhấn phím cách.
bash
. Nó hoạt động nếu bạn sử dụng read _
thay thế, nếu bạn có một số vỏ khác bash
.
''
chứa một không gian bên trong?
''
một chuỗi trống. Không có không gian bên trong. Tôi đoán, nó cũng phù hợp, nếu bạn nhập ENTER hoặc TAB
Phương pháp được thảo luận trong Câu hỏi và trả lời SO này có thể là ứng cử viên tốt nhất để thay thế cho pause
hành vi mà bạn quen thuộc trên Windows khi thực hiện các tệp BAT.
$ read -rsp $'Press any key to continue...\n' -n1 key
Ở đây tôi đang chạy ở trên và sau đó chỉ cần nhấn bất kỳ phím nào, trong trường hợp này là Dphím.
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
$
trước chuỗi ở đây : -rsp $'Press
?
echo -e "..."
dòng bổ sung nào . Nó nhỏ gọn hơn nhiều trong những tình huống đó.
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"
Điều này bây giờ in một dấu nhắc mà không có dòng mới, xử lý CTRL+C
đáng tin cậy, stty
chỉ gọi thường xuyên khi cần thiết và khôi phục tty kiểm soát để chính xác trạng thái stty
tìm thấy nó. Xem xét man stty
thông tin về cách kiểm soát tiếng vang, điều khiển nhân vật và tất cả.
Bạn cũng có thể làm điều này:
printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty
Bạn có thể làm điều đó với ENTER
, không có [
bài kiểm tra ]
và không stty
thích:
sed -n q </dev/tty
Bạn có thể tạo một chức năng cho nó:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
Sau đó, bạn có thể sử dụng điều này ở mọi nơi trong tập lệnh của bạn:
pause
Cài đặt IFS
cho chuỗi trống ngăn chặn hành vi mặc định của việc đọc khoảng trắng.
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
# Set IFS to empty string so that read doesn't trim
# See http://mywiki.wooledge.org/BashFAQ/001#Trimming
IFS= read -n1 -r key
[[ $key == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
CẬP NHẬT 2018-05-23: Chúng tôi có thể đơn giản hóa điều này bằng cách sử dụng biến REPLY, không thuộc đối tượng chia từ:
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
read -n1 -r
[[ $REPLY == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
Đây là một cách hoạt động trong cả hai bash
và zsh
, và đảm bảo I / O cho thiết bị đầu cuối:
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
Đặt nó trong .{ba,z}shrc
Công lý vĩ đại của bạn !