我有一个Bash shell脚本,我想暂停执行,直到用户按下一个键。在DOS中,这可以通过pause命令轻松完成。在我的脚本中是否有一个Linux等效程序?


当前回答

这个函数在bash和zsh中都可以工作,并确保到终端的I/O:

# 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

把它放进你的。{ba,z}shrc代表大正义!

其他回答

我经常使用这些非常简短的方法,它们就像@theunamedguy和@Jim解决方案,但除此之外还有暂停和沉默模式。

我特别喜欢最后一种情况,并在许多循环运行的脚本中使用它,直到用户按下Enter。

命令

Enter solution read -rsp $'Press enter to continue...\n' Escape solution (with -d $'\e') read -rsp $'Press escape to continue...\n' -d $'\e' Any key solution (with -n 1) read -rsp $'Press any key to continue...\n' -n 1 key # echo $key Question with preselected choice (with -ei $'Y') read -rp $'Are you sure (Y/n) : ' -ei $'Y' key; # echo $key Timeout solution (with -t 5) read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5; Sleep enhanced alias read -rst 0.5; timeout=$? # echo $timeout

解释

-r指定原始模式,不允许“\”或“^”这样的组合字符。

-s指定静默模式,因为我们不需要键盘输出。

-p $'prompt'指定提示符,需要在$'和'之间,以允许空格和转义字符。注意,你必须在单引号之间放上美元符号以利于转义字符,否则你可以使用简单的引号。

-d $'\e'指定转义符作为分隔符,因此作为当前条目的最后一个字符,可以放置任何字符,但要注意放置用户可以键入的字符。

-n 1指定只需要一个字符。

-e指定readline模式。

-i $'Y'指定Y作为readline模式的初始文本。

-t 5指定5秒的超时时间

如果你需要知道输入,在-n1情况下,是被按下的键。

$ ?用于知道上一个程序的退出码,用于读取,超时情况下142,正确输入0。把美元吗?在一个变量中,如果你需要在一些命令之后尽快测试它,因为所有的命令都会重写$?

Read是这样做的:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

-n1指定它只等待一个字符。-r将它置于原始模式,这是必要的,否则,如果你按下反斜杠之类的键,它直到你按下一个键才会注册。-p指定提示符,如果包含空格,则必须加引号。只有当你想知道他们按了哪个键时,key参数才有必要,在这种情况下,你可以通过$key访问它。

如果使用Bash,还可以使用-t指定超时,这将导致read在未按下键时返回失败。例如:

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

这个函数在bash和zsh中都可以工作,并确保到终端的I/O:

# 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

把它放进你的。{ba,z}shrc代表大正义!

Read -n1是不可移植的。一种便携的方法可以做到这一点:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

除了使用read,如果只是按ENTER继续提示,你可以这样做:

sed -n q </dev/tty

如果您只是需要暂停一个循环或脚本,并且您很乐意按Enter键而不是任何键,那么read本身就可以完成工作。

do_stuff
read
do_more_stuff

这不是终端用户友好的,但在您为自己编写快速脚本,并且需要暂停脚本以在后台手动执行某些操作的情况下,这可能足够了。