Как отключить Ctrl- c в неинтерактивном скрипте bash и его подпрограммах git - PullRequest
0 голосов
/ 02 февраля 2020

Я звоню git клону из неинтерактивной оболочки bash. Он не является интерактивным, потому что запускается из контекстного меню Windows Explorer. Я использую git версию 2.20.1. windows .1 на Windows 10 64-бит.

Я запускаю Git / usr / bin / bash -l -e 'myscript' в окне Git / usr / bin / mintty, запущенном из контекстного меню.

Я хочу заблокировать пользователя от прерывания клона git с помощью Ctrl- c.

Я пытался:

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

Ctrl- c проходит к клону git, который выходит. Я предполагаю, что у него есть обработчик сигнала, который выходит из SIGINT. Я хотел бы знать, почему это не работает.

Я пытался:

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

Stty завершается ошибкой с "stty: стандартный ввод: неуместно ioctl для устройства", потому что нет tty для неинтерактивная bash оболочка. Так как же ctrl- c добраться до клона git, если tty отсутствует?

Я тестирую с клоном git, но хочу развернуть его для git pull и git pu sh. Наши разработчики приводили к тому, что их локальные репозитории были непоследовательными, прерывая длительное git нажатие ctrl- c.

. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 02 февраля 2020

Процессы, которые обрабатывают сами сигналы (примеры выглядят как git, ping и scp), предотвращают вызов родителя trap.

Так что этот простой пример не подходит этим цели:

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

Этот ответ предлагает использовать set -m (процессы выполняются в отдельной группе процессов) в подоболочке, которая не отправляет SIGINT процессу:

#!/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).

...