LINUX.ORG.RU

Git-хук на bash дает ошибку «Неприменимый к данному устройству ioctl». На sh все в порядке

 , , , ,


0

1

Система Astra Linux 1.6

Имеется развесистый git-хук pre-commit, написанный на bash. Если сделать коммит, то в консоль вываливается три сообщения:

stty: 'стандартный ввод': Неприменимый к данному устройству ioctl
stty: 'стандартный ввод': Неприменимый к данному устройству ioctl
stty: 'стандартный ввод': Неприменимый к данному устройству ioctl

Вроде все работает, но эти сообщения нужно убрать.

Я стал разбираться, и сократил git-хук до такого состояния:
#!/bin/bash
echo "Hello pre-commit"
Но сообщения про ioctl все равно появляются.

Тогда я заменил в этом минимальном примере #!/bin/bash на #!/bin/sh, и сообщения об ошибке пропали!

И вот вопрос: скрипт хука весьма обширный, и переводить его с bash на sh - вообще не вариант. Что нужно докрутить, чтобы этих ошибок не было?


PS: Проверил то же самое на Debian 12, такой проблемы нет. Это именно Астровская проблема.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

И вот вопрос: скрипт хука весьма обширный, и переводить его с bash на sh - вообще не вариант. Что нужно докрутить, чтобы этих ошибок не было?

Сделай хук на sh:

#!/bin/sh -e

cat | bash_hook

возможно поможет

firkax ★★★★★
()
Ответ на: комментарий от Elyas

Не, вы не поняли.

Я, видимо не написал ограничения. Нужно не второй скрипт сделать, и хитрым образом его вызывать, а что-то изменить в hook-скрипте, чтобы не появлялось ошибки. Это возможно?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Elyas

Нет, все равно ошибка лезет на самом вызове bash.

#!/bin/sh
echo "In sh-script"
/bin/bash bash-script

Результат:
In sh-script
stty: 'стандартный ввод': Неприменимый к данному устройству ioctl
stty: 'стандартный ввод': Неприменимый к данному устройству ioctl
stty: 'стандартный ввод': Неприменимый к данному устройству ioctl
Hello pre-commit

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от firkax

Ну мало ли что ты имел в виду, тем более в том виде что ты написал, скрипт хука не вызывается. Правильно так:

#!/bin/sh -e
cat | ./bash_hook
Но все равно, на этой команде, при самом запуске bash_hook, как и в случае Elyas, лезут те же три строки с ошибкой.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea
#!/bin/sh -e
R=`cat | bash_hook`
echo $R

А ещё вот - засунь туда strace и посмотри какой именно ioctl фейлится. Потому найди его в исходнике баша и посмотри от чего зависит его вызов.

#!/bin/sh -e

strace -o /tmp/xxx.log ./bash_hook

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от Xintrea

В этом варианте есть возможность устанавливать параметры bash. Я бы предложил

/bin/bash --rcfile /dev/null -c script

Или посмотреть, что в ~/.bashrc, /etc/bash.bashrc… и т.п. Возможно проблема решится, если для git-юзера сделать правильный ~/.bashrc

Elyas ★★★★★
()
Ответ на: комментарий от Xintrea

Напомню, что шел бывает interactive и non-interactive (как его git вызывает).

Всякие махинации с stty в ~/.bashrc и т.п. могут приводить к таким ошибкам. Где-то оно у тебя вызывается, только вот в non-interactive mode оно не работает.

PS: ну вот же оно:

open("/home/xintrea/.bashrc", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=675, ...}) = 0
brk(0x7a4000)                           = 0x7a4000
read(3, "export PATH=/usr/local/bin:/usr/"..., 675) = 675
close(3)                                = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
brk(0x7a5000)                           = 0x7a5000
brk(0x7a6000)                           = 0x7a6000
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/opt/qt_5_12_6/Tools/QtCreator/bin/stty", 0x7fff0d59b370) = -1 ENOENT (No such file or directory
)
stat("/opt/qt_5_12_6/5.12.6/gcc_64/bin/stty", 0x7fff0d59b370) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/stty", 0x7fff0d59b370) = -1 ENOENT (No such file or directory)
stat("/usr/bin/stty", 0x7fff0d59b370)   = -1 ENOENT (No such file or directory)
stat("/bin/stty", {st_mode=S_IFREG|0755, st_size=77269, ...}) = 0
stat("/bin/stty", {st_mode=S_IFREG|0755, st_size=77269, ...}) = 0
geteuid()                               = 2506
getegid()                               = 2500
getuid()                                = 2506
getgid()                                = 2500
access("/bin/stty", X_OK)               = 0
stat("/bin/stty", {st_mode=S_IFREG|0755, st_size=77269, ...}) = 0
geteuid()                               = 2506
getegid()                               = 2500
getuid()                                = 2506
getgid()                                = 2500
access("/bin/stty", R_OK)               = 0
stat("/bin/stty", {st_mode=S_IFREG|0755, st_size=77269, ...}) = 0
stat("/bin/stty", {st_mode=S_IFREG|0755, st_size=77269, ...}) = 0
geteuid()                               = 2506
getegid()                               = 2500
getuid()                                = 2506
getgid()                                = 2500
access("/bin/stty", X_OK)               = 0
stat("/bin/stty", {st_mode=S_IFREG|0755, st_size=77269, ...}) = 0
geteuid()                               = 2506
getegid()                               = 2500
getuid()                                = 2506
getgid()                                = 2500
access("/bin/stty", R_OK)               = 0
beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Спасибо, я походу нашел проблему.

В ~./bashrc имеются такие команды:

stty lnext undef
stty start undef
stty intr ^Q

Это я так высвобождаю сочетания Ctrl+C/Ctrl+V, чтобы они работали с буфером обмена как в DE, и перевешиваю прекращение программы на Ctrl+Q.

https://webhamster.ru/site/page/index/articles/comp/8

Вот на них и происходит вывод сообщений об ошибках.

Xintrea ★★★★★
() автор топика