在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命令;任何其他命令都会跳过它。无论哪种方式,脚本结束并返回到常规命令提示符。