Баг (как выяснилось, фича) в bash (у вас воспроизведётся?)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Баг (как выяснилось, фича) в bash

Сообщение Bizdelnick »

Имеем вот такой скрипт:

Код: Выделить всё

#!/bin/bash

{
        echo "block 1, fd=3"
        fuser -v testfile
} 3<>testfile

echo "exited block 1"
fuser -v testfile

{
        echo "block 2, fd=$fd"
        fuser -v testfile
} {fd}<>testfile

echo "exited block 2"
fuser -v testfile
Два практически идентичных блока, единственное отличие — в первом файл testfile открывается с явным назначением дескриптора 3, во втором — с автоматическим назначением дескриптора. По идее, внутри блоков fuser должен показывать, что файл открыт, вне их — не выводить ничего, поскольку файл закрыт. Что имеем на самом деле:

Shell

% ./test.sh
block 1, fd=3
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/tmp/testfile:
user 8826 F.... test.sh
exited block 1
block 2, fd=10
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/tmp/testfile:
user 8826 F.... test.sh
exited block 2
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/tmp/testfile:
user 8826 F.... test.sh
%
То есть при выходе из первого блока, как и ожидалось, файл был закрыт, а при выходе из второго — нет. Для сравнения запустим тот же скрипт в ksh93:

Shell

% ksh93 test.sh
block 1, fd=3
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/tmp/testfile:
user 9292 F.... ksh93
exited block 1
block 2, fd=11
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/tmp/testfile:
user 9292 F.... ksh93
exited block 2
%
Он благополучно закрывает файл в обоих случаях.

А как ведёт себя этот код в вашей системе, и какая у вас версия bash?

Shell

% bash --version
GNU bash, версия 5.0.3(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или более поздней <http://gnu.org/licenses/gpl.html>

Это свободное программное обеспечение. Вы можете изменять и распространять его.
НИКАКАЯ ГАРАНТИЯ не предоставляется в пределах, допускаемых законом.
%
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Баг в bash

Сообщение azsx »

Shell

bash 1.sh
block 1, fd=3
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/put/testfile:
user 32615 F.... bash
exited block 1
block 2, fd=10
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/put/testfile:
user 32615 F.... bash
exited block 2
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/put/testfile:
user 32615 F.... bash

Shell

bash --version
GNU bash, версия 5.0.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или более поздней <http://gnu.org/licenses/gpl.html>

Это свободное программное обеспечение. Вы можете изменять и распространять его.
НИКАКАЯ ГАРАНТИЯ не предоставляется в пределах, допускаемых законом.
Спасибо сказали:
Аватара пользователя
yoricI
Сообщения: 2346
ОС: gentoo fluxbox

Re: Баг в bash

Сообщение yoricI »

$ tst.sh block 1, fd=3 USER PID ACCESS COMMAND /home/globus/testfile: globus 14771 F.... tst.sh exited block 1 block 2, fd=10 USER PID ACCESS COMMAND /home/globus/testfile: globus 14771 F.... tst.sh exited block 2 USER PID ACCESS COMMAND /home/globus/testfile: globus 14771 F.... tst.sh globus@aspera ~ $ bash --version GNU bash, version 5.1.8(1)-release (x86_64-pc-linux-gnu)
Думал, что это может быть из-за того, что файл назван test и конфликтует с системным, но нет.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Баг в bash

Сообщение olecya »

У меня были косяки и именно с универсальным дескриптором.
Добавлено (17:01):
Похоже вот так не работает {var}<
Добавлено (17:12):
Bizdelnick писал:
21.05.2021 16:33
А как ведёт себя этот код в вашей системе, и какая у вас версия bash?

Shell

bash --version
GNU bash, версия 5.1.0(1)-release (x86_64-redhat-linux-gnu)

/test.sh
block 1, fd=3
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/home/nez/bash/unixforum/Bizdelnik/mutex/fuser/testfile:
nez 8131 F.... test.sh
exited block 1
block 2, fd=10
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/home/nez/bash/unixforum/Bizdelnik/mutex/fuser/testfile:
nez 8131 F.... test.sh
exited block 2
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/home/nez/bash/unixforum/Bizdelnik/mutex/fuser/testfile:
nez 8131 F.... test.sh
Я не совсем еще разобралась с происходящим...
Добавлено (18:00):
Дико извиняюсь, что ввела в заблуждение. Эта конструкция не подставляет значение из переменной, а так же как и в exec {fd}> file
подбирает свободный дескриптор для файла:

Код: Выделить всё

!/bin/bash
{
        echo block 1
        fuser -v testfile
} {fd}>testfile
echo $fd

lsof +d .
read

Shell

./test.sh
block 1
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/home/nez/bash/unixforum/Bizdelnik/mutex/fuser/testfile:
nez 10572 F.... test.sh
10
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 5573 nez cwd DIR 8,1 4096 4326180 .
bash 9814 nez cwd DIR 8,1 4096 4326180 .
test.sh 10572 nez cwd DIR 8,1 4096 4326180 .
test.sh 10572 nez 10w REG 8,1 0 4326181 ./testfile
test.sh 10572 nez 255r REG 8,1 102 4326214 ./test.sh
lsof 10574 nez cwd DIR 8,1 4096 4326180 .
lsof 10575 nez cwd DIR 8,1 4096 4326180 .
Добавлено (18:16):
Вот так будет лучше видно:

Код: Выделить всё

#!/bin/bash
{
        echo block 1
} {fd}>testfile
echo $fd

{
        echo block 2
} {fd}>testfile
echo $fd

lsof +d .
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Баг в bash

Сообщение Bizdelnick »

Задокументированный баг считается фичей?
man bash писал(а):If {varname} is supplied, the redirection persists beyond the scope of the command, allowing the shell programmer to manage the file descriptor himself.
Не вижу никакого разумного обоснования для такого поведения…
Добавлено (19:12):
olecya писала:
21.05.2021 16:58
Дико извиняюсь, что ввела в заблуждение.
Если даже и пытались, Вам это не удалось. ☺
У меня нет привычки копипастить код, не глядя в документацию. Хотя в данном случае я её недочитал.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Баг в bash

Сообщение olecya »

Вроде нашла альтернативу:

Код: Выделить всё

#!/bin/bash

{
        echo "block 1, fd=3"
        fuser -v testfile
} 3<>testfile

echo "exited block 1"
fuser -v testfile

(
        echo "block 2, fd=$fd"
        fuser -v testfile
) {fd}<>testfile

echo "exited block 2"
fuser -v testfile
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Баг в bash

Сообщение Bizdelnick »

Ну ладно, допустим, это фича. Мне дозволили самому управлять дескриптором, хоть я об этом и не просил. Как мне его закрыть-то?

Shell

$ { echo "fd=$fd"; } {fd}<>testfile
fd=10
$ exec $fd>&-
bash: exec: 10: не найден
$
Добавлено (19:37):
olecya писала:
21.05.2021 19:29
Вроде нашла альтернативу
Я об этом думал, хотя так и не попробовал. Так хотелось обойтись без сабшелла…
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Баг в bash

Сообщение olecya »

Выход из сабшела автоматически закрывает дескриптор.
В конструкции с блоком, оболочка сперва выполняет команду перенаправления,
а значит закрывать нужно в самом блоке в последней строчке или через && exec {fd}>&- в самом конце
Но это очень неудобный вариант хотя и рабочий
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Баг в bash

Сообщение Bizdelnick »

olecya писала:
21.05.2021 20:05
В конструкции с блоком, оболочка сперва выполняет команду перенаправления,
а значит закрывать нужно в самом блоке в последней строчке или через && exec {fd}>&- в самом конце
С фигурными скобками работает, спасибо. Как внутри блока, так и после него.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Баг в bash

Сообщение Bizdelnick »

Всё-таки решил поругаться в багтрекере. Не баг, так хотелка пусть будет.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить