假设我想跑步
git ls-remote "https://github.com/OrgName/RepoName.git" branchname
branchname
在脚本中“ping” GitHub 以检查指定存储库中是否存在分支。
GitHub 可能有两种响应:
如果
branchname
存在,命令将以退出代码完成,并且 GitHub 将返回一些我可以解析的信息。如果
branchname
不存在,GitHub 将要求我输入用户名,并且脚本将在提示符处挂起
Username for 'https://github.com':
等待输入。
我可以在脚本中检查哪些条件来区分这两种情况?也就是说,是否有任何条件会告诉我“该命令未返回退出代码,而是在等待用户输入”,以便我可以将其切断,认为该git ls-remote
命令失败,然后继续执行脚本?
我尝试过重定向/dev/null
到
git ls-remote -h "https://github.com/OrgName/RepoName.git" &> /dev/null
但脚本仍然挂起,提示我输入 GitHub 用户名。
答案1
是否存在任何情况可以告诉我“该命令尚未返回退出代码,而是正在等待用户输入”,以便我可以将其切断[…]?
如果没有其他工具的支持,Bash 不会处于终端和命令之间。当命令在前台时,Bash 会在后台等待。它不会中继输入或输出。命令(此处:)git
直接使用终端。
一个设计用于位于终端和任何命令之间的工具expect(1)
。有了它,您可以自动响应提示。不过似乎您不需要expect
。您可以通过配置来完成您想要做的事情git
。
你想“认为该git ls-remote
命令失败”。看看man 1 git
GIT_TERMINAL_PROMPT
关于环境变量的状态:
GIT_TERMINAL_PROMPT
如果此环境变量设置为0
,git
则不会在终端上提示(例如,在要求进行 HTTP 身份验证时)。
GIT_TERMINAL_PROMPT=0 git ls-remote "https://github.com/OrgName/RepoName.git" branchname
如果不是变量,上述命令会提示我输入用户名。由于变量,它会打印fatal: could not read Username for 'https://github.com': terminal prompts disabled
。可以通过 来隐藏该消息2>/dev/null
。退出状态为128
。
请注意,此解决方案不会使 Bash 识别git
提示,也不会使 Bash “切断它”。git
它自行失败并且 Bash 继续执行下一个命令。
我相信GIT_TERMINAL_PROMPT=0
您可以通过检查的退出状态来区分这两种情况git
。