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 _
分析解答

bash没有办法将"preload"作为下一个输入缓冲区(与zsh不同,在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 library输入文本行; -i选项预加载输入缓冲区。 (没有-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"

按Enter键接受pre-loaded Y触发hard-coded`checkout命令;任何其他命令都会跳过它。无论哪种方式,脚本结束并返回到常规命令提示符。