Bash 能否识别何时要求输入?

Bash 能否识别何时要求输入?

假设我想跑步

git ls-remote "https://github.com/OrgName/RepoName.git" branchname

branchname在脚本中“ping” GitHub 以检查指定存储库中是否存在分支。

GitHub 可能有两种响应:

  1. 如果branchname存在,命令将以退出代码完成,并且 GitHub 将返回一些我可以解析的信息。

  2. 如果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 gitGIT_TERMINAL_PROMPT关于环境变量的状态:

GIT_TERMINAL_PROMPT
如果此环境变量设置为0git则不会在终端上提示(例如,在要求进行 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

相关内容