首页 > 解决方案 > 在 shell 提示符下键入文本

问题描述

shell脚本中有什么方法可以通过编程方式设置输入行吗?考虑以下场景。

假设我编写了一个脚本来创建一个 git 分支,并且在它完成创建一个分支之后,我不想以编程方式切换到新分支,而只是给用户提示符上显示的命令,所以用户不要必须键入命令才能切换到新分支,但如果他想运行显示的命令,只需按 enter 键。

read -p "Enter your branch name: " N
git branch $N
render-text-on-prompt "git checkout $N"

执行:

$ ./mkbranch
$ Enter your branch name: change-93
$ git checkout change-93 _

标签: bashshellreadline

解决方案


bash没有办法“预加载”下一个输入缓冲区(与 不同zsh,您可以在其中简单地使用print -z "git checkout $N")。您需要自己mkbranch处理输入(并随后执行输入的命令)。

read -p "Enter your branch name: " N
git branch "$N"
read -e -i "git checkout $N" cmd
eval "$cmd"

-e通知read使用 Readline 库输入文本行;该-i选项预加载输入缓冲区。(没有 the-e不会-i做任何事情。)

请注意,read -e它本身对语法一无所知bash,因此没有隐式续行;这使它与普通bash提示明显不同。

另一种方法是简单地询问用户是否要签出新创建的分支:

read -p "Enter your branch name: " N
git branch "$N"
read -e -i Y -p "Checkout branch $N? (Y/n)"
[[ $REPLY == Y ]] && git checkout "$N"

按回车接受预加载的 Y 以触发硬编码的 `checkout 命令;任何其他命令都会跳过它。无论哪种方式,脚本都会结束并返回到常规命令提示符。


推荐阅读