作为自由式作业的一部分,我无法在容器内非交互地运行repo。
它提示输入用户名和电子邮件。我通过在工作中进行git config --global
来解决这个问题。
但是它会进行颜色测试,并且会无限期地挂起。
看回购的源代码,我看到了
if os.isatty(0) and os.isatty(1) and not self.manifest.IsMirror:
if opt.config_name or self._ShouldConfigureUser():
self._ConfigureUser()
self._ConfigureColor()
因此,我在容器中运行了以下内容:
python -C "import os; print os.isatty(0), os.isatty(1)"
当然,它已经打印出True True
查看Jenkins日志,它将启动指定了--tty
的容器,似乎无法配置该选项。
我找不到bash
选项来强制脚本在非交互式shell中运行。如果我将上面的python行放入文件中,并使用几乎所有命令和选项的组合来执行它,它仍然会打印出True True
我发现 only 的另一种方式是是否使用I / O重定向
bash <a.sh
会打印出False True
-即stdin
不是tty,并且
bash <a.sh >a.log
将显示False False
。
对于复杂的脚本,使用bash <script
方法是否有问题?
有人知道任何詹金斯魔术来阻止使用--tty
启动docker吗?
我知道--tty
是元凶。我在本地构建了容器,然后运行了以下
$ docker run repotest python -c "import os;print os.isatty(0), os.isatty(1)"
False False
$ docker run --tty repotest python -c "import os;print os.isatty(0), os.isatty(1)"
True True
运行版本:
我正在使用“在docker容器内构建”选项。
答案 0 :(得分:1)
要“非交互地”运行bash脚本repo_script.sh
,或者更确切地说,在没有与标准流相关联的终端的情况下,您可以像这样简单地运行脚本
repo_script.sh < /dev/null 2>&1 | cat
假设您希望以类似于repo_script.sh
的方式查看输出。通过将标准输出和错误传递给其他进程,文件描述符显示为管道,而不是repo_script.sh
的TTY。您也可以将输出定向到文件,或者如果不关心输出,甚至定向到/dev/null
:
log_file=/dev/null
repo_script.sh < /dev/null > "${log_file}" 2>&1
以
运行脚本 bash < repo_script.sh | cat
也可能会起作用,尽管这是非常不合常规的,而且我认为运行脚本的黑手党方式只是为了打破TTY与标准输入的关联。从脚本引擎的角度来看,从文件中读取脚本程序与从标准输入中读取脚本程序是不同的(通常,如果它是终端,则不可搜索),因此可以< / em>可能以意想不到的方式咬你。这种方式无法将您的意图明确传达给下一个需要了解您代码的人,并且可能由于头部外伤而导致该人部分脱发。
不需要任何bash选项,仅使用如上所述的解释外壳中的输出方向即可轻松理解,兼容多平台的标准约定,以更改标准流关联。
P.S。我认为您的repo脚本只需测试标准输入是否为TTY就足够了。在我看来,该脚本的作者在那里没有足够深入的思考。如果您没有与标准输入相关联的终端设备,那么根本没有用等待输入,并且您可以确定一切都需要在没有用户交互的情况下运行,或者在不可能的情况下以错误停止。