bash - 在 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 _
解决方案
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 命令;任何其他命令都会跳过它。无论哪种方式,脚本都会结束并返回到常规命令提示符。
推荐阅读
- linux - 在centos(vps)中恢复特定目录中已删除的文件
- java - 如何在java spring REST上返回由对象包装的数组字节
- exception - OfficeXml 文件异常。我该如何解决?
- angular - Angular 6在客户端打印
- xml - 关于如何将 swagger yaml 文件(仅定义部分)转换为 XSD 的任何建议?
- javascript - 尝试将工作表行数据发送到 GmailApp 时缺少变量名称;Javascript/谷歌应用脚本
- node.js - Dialogflow 自定义有效负载未在 facebook messenger 中发布消息
- css - Prepros 预处理器不编译 mixins
- python - Python - 多线程按顺序运行
- sql - 以下哪个 SQL 查询可以找到所有申请 CS 但未申请 ME 的学生的 sid?