繁体   English   中英

如何在非交互式 bash 脚本及其 git 子程序中禁用 ctrl-c

[英]How to disable ctrl-c in a non-interactive bash script and its git subprograms

我正在从非交互式 bash shell 调用 git clone。 它是非交互式的,因为它是从 Windows 资源管理器的连接菜单中启动的。 我在 Windows 10 64 位上运行 git 版本 2.20.1.windows.1。

我正在从上下文菜单启动的 Git/usr/bin/mintty 窗口中运行 Git/usr/bin/bash -l -e 'myscript' 。

我想阻止用户使用 ctrl-c 中断 git clone。

我试过:

set -m
trap '' SIGINT SIGTERM (2 single quotes)
git clone ... &
wait -n
echo $?

ctrl-c 传递到退出的 git clone。 我假设它有一个在 SIGINT 上退出的信号处理程序。 我想知道为什么这不起作用。

我试过:

saved=$(stty -g)
stty -isig
git clone ...
stty "$saved"

stty 因“stty:标准输入:设备的 ioctl 不合适”而失败,因为没有用于非交互式 bash shell 的 tty。 那么如果没有 tty,ctrl-c 是如何到达 git clone 的呢?

我正在使用 git clone 进行测试,但想为 git pull 和 git push 部署它。 我们的开发人员通过使用 ctrl-c 中断长时间的 git pull 导致他们的本地存储库不一致。

任何帮助,将不胜感激。

自己处理信号的进程(例如gitpingscp )会阻止调用父trap

所以这个简单的例子不适合这些目的:

#!/bin/bash
trap '' SIGINT SIGTERM
sleep 10

这个答案建议在不向进程发送 SIGINT 的子shell中使用set -m (进程在单独的进程组中运行):

#!/bin/bash
trap '' SIGINT SIGTERM
uninterruptableCommand="git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/"
( set -m; $uninterruptableCommand & wait )

警告:该示例是一个真正长时间运行的命令。 您仍然可以直接向进程发送信号(例如pkill git )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM