Câu trả lời:
read
thực hiện điều này:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
Việc -n1
xác định rằng nó chỉ chờ một ký tự duy nhất. Việc -r
đặt nó vào chế độ thô, điều này là cần thiết bởi vì nếu không, nếu bạn nhấn một cái gì đó như dấu gạch chéo ngược, nó sẽ không đăng ký cho đến khi bạn nhấn phím tiếp theo. Các -p
quy định cụ thể các dấu nhắc, mà phải được trích dẫn nếu nó chứa dấu cách. Đối key
số chỉ cần thiết nếu bạn muốn biết họ đã nhấn phím nào, trong trường hợp nào bạn có thể truy cập thông qua $key
.
Nếu bạn đang sử dụng Bash, bạn cũng có thể chỉ định thời gian chờ với -t
, điều này khiến cho việc đọc trở lại thất bại khi nhấn phím. Ví dụ:
read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
echo 'A key was pressed.'
else
echo 'No key was pressed.'
fi
Press a key to continue...
thì ngay cả người dùng mới làm quen cũng có thể tìm thấy a
phím và bấm nó; o)
command | myscript.sh
hoặc myscript.sh | command
. Xem câu trả lời này cho một giải pháp.
read: 1: read: Illegal option -n
đảm bảo bọc lệnh của bạn trong bash -c 'command && command'
vv vì lỗi đó có thể xảy ra sh
. Tôi đang làm điều này trong một lệnh bao bọc Lando.
Tôi sử dụng những cách này rất ngắn, và chúng giống như các giải pháp @theunamedguy và @Jim, nhưng ngoài ra còn có chế độ chờ và chế độ im lặng.
Tôi đặc biệt yêu thích trường hợp cuối cùng và sử dụng nó trong rất nhiều tập lệnh chạy trong một vòng lặp cho đến khi người dùng nhấn Enter.
Nhập giải pháp
read -rsp $'Press enter to continue...\n'
Giải pháp thoát hiểm (với -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Bất kỳ giải pháp chính nào (với -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Câu hỏi với lựa chọn được chọn trước (với -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Giải pháp hết thời gian (với -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Bí danh tăng cường giấc ngủ
read -rst 0.5; timeout=$?
# echo $timeout
-r chỉ định chế độ thô, không cho phép các ký tự kết hợp như "\" hoặc "^".
-s chỉ định chế độ im lặng và vì chúng tôi không cần đầu ra bàn phím.
-p $ ' prompt ' chỉ định lời nhắc, cần nằm trong khoảng $ 'và' để cho phép khoảng trắng và ký tự thoát. Hãy cẩn thận, bạn phải đặt giữa các dấu ngoặc đơn với ký hiệu đô la để mang lại lợi ích cho các ký tự thoát, nếu không bạn có thể sử dụng các trích dẫn đơn giản.
-d $ ' \ e ' chỉ định escappe là ký tự phân cách, vì vậy là ký tự cuối cùng cho mục nhập hiện tại, điều này có thể đặt bất kỳ ký tự nào nhưng hãy cẩn thận để đặt một ký tự mà người dùng có thể nhập.
-n 1 chỉ định rằng nó chỉ cần một ký tự duy nhất.
-e chỉ định chế độ đọc.
-i $ ' Y ' chỉ định Y là văn bản ban đầu ở chế độ đọc.
-t 5 chỉ định thời gian chờ là 5 giây
phục vụ khóa trong trường hợp bạn cần biết đầu vào, trong trường hợp -n1, phím đã được nhấn.
$? phục vụ để biết mã thoát của chương trình cuối cùng, để đọc, 142 trong trường hợp hết thời gian, 0 đầu vào đúng. Đặt $? trong một biến càng sớm càng tốt nếu bạn cần kiểm tra nó sau các lệnh somes, bởi vì tất cả các lệnh sẽ viết lại $?
-s
; man read
và read --help
trợ giúp đã không giúp đỡ trên Ubuntu 10.04.1 LTS. Chỉnh sửa: help read
đã làm; phần còn lại không được chấp nhận?
read: -i: invalid option
cho người cũ. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
thay vào đó, #osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
hoạt động với tôi. `
-i
hoạt động hoàn hảo trên Ubuntu, tôi cũng không biết làm thế nào nếu -d
hoạt động tương tự trên OSX.
Điều này làm việc cho tôi về nhiều hương vị của Linux, trong đó một số giải pháp khác không có (bao gồm cả những giải pháp phổ biến nhất ở đây). Tôi nghĩ nó cũng dễ đọc hơn ...
echo Press enter to continue; read dummy;
Lưu ý rằng một biến cần được cung cấp làm đối số read
.
read -n1
không phải là di động. Một cách di động để làm điều tương tự có thể là:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Bên cạnh việc sử dụng read
, chỉ cần nhấn ENTER
để tiếp tục nhắc bạn có thể làm:
sed -n q </dev/tty
status=none
cũng không phải là di động. Thay vào đó, chuyển hướng stdout và stderr sang / dev / null. read -r line < /dev/tty
sẽ là enought cho nhấn ENTER ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
để lưu và khôi phục cài đặt tty.
tr
chỉnh sửa cũng có thể hoạt động không?
tr
sẽ đệm đầu ra của nó dưới dạng ống và bàn phím không phải của Hoa Kỳ có các phím gửi ký tự ngoài \1-\177
phạm vi. dd
là cách thành ngữ ở đây.
Nếu bạn chỉ cần tạm dừng một vòng lặp hoặc tập lệnh và bạn vui lòng nhấn Enter thay vì bất kỳ phím nào, thì read
chính nó sẽ thực hiện công việc.
do_stuff
read
do_more_stuff
Nó không thân thiện với người dùng cuối, nhưng có thể là đủ trong trường hợp bạn tự viết một tập lệnh nhanh và bạn cần tạm dừng nó để làm một cái gì đó thủ công trong nền.
Thử cái này:
function pause(){
read -p "$*"
}
Hàm này 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 !
Có để sử dụng read
- và có một vài điều chỉnh làm cho nó hữu ích nhất trong cả cron
và trong thiết bị đầu cuối.
Thí dụ:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-N 120 làm cho câu lệnh đọc hết thời gian sau 2 phút để nó không bị chặn cron
.
Trong terminal, nó cho 2 phút để xem rsync
lệnh mất bao lâu để thực thi.
Sau đó, tiếp theo echo
là vì vậy dấu nhắc bash tiếp theo sẽ xuất hiện trên dòng tiếp theo.
Nếu không, nó sẽ hiển thị trên cùng một dòng ngay sau khi "tiếp tục ..." khi Enterđược nhấn trong thiết bị đầu cuối.
"Enter any non-NUL character to continue"
. Một số phím không gửi bất kỳ ký tự nào (nhưCtrl
...) và một số phím gửi nhiều hơn một (nhưF1
,Home
...).bash
bỏ qua các ký tự NUL.