<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>32110</bug_id>
          
          <creation_ts>2016-05-18 21:47:55 +0300</creation_ts>
          <short_desc>bash --rpm-requires fails on the syntax of shopt -s extglob</short_desc>
          <delta_ts>2018-12-21 01:19:51 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>bash</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc>https://lists.altlinux.org/pipermail/devel/2016-May/201432.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>31399</dependson>
          <blocked>32136</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ivan Zakharyaschev">imz</reporter>
          <assigned_to name="placeholder@altlinux.org">placeholder</assigned_to>
          <cc>aen</cc>
    
    <cc>alex</cc>
    
    <cc>alexey.tourbin</cc>
    
    <cc>at</cc>
    
    <cc>cas</cc>
    
    <cc>ekorneechev</cc>
    
    <cc>glebfm</cc>
    
    <cc>kde</cc>
    
    <cc>ldv</cc>
    
    <cc>mike</cc>
    
    <cc>placeholder</cc>
    
    <cc>rider</cc>
    
    <cc>vt</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>156857</commentid>
    <comment_count>0</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2016-05-18 21:47:55 +0300</bug_when>
    <thetext>bash-3.2.57-alt1

As described in https://lists.altlinux.org/pipermail/devel/2016-May/201432.html , the following failure:

Executing: /bin/sh -e /usr/src/tmp/rpm-tmp.yxuvVs
find-requires: running scripts (cpp,debuginfo,files,lib,pam,perl,pkgconfig,pkgconfiglib,python,rpmlib,shebang,shell,static,symlinks)
/usr/src/tmp/mosquito-hive-buildroot/usr/share/mosquito-hive/rebuild-helper-one.sh: line 22: syntax error near unexpected token `(&apos;
/usr/src/tmp/mosquito-hive-buildroot/usr/share/mosquito-hive/rebuild-helper-one.sh: line 22: `	-*([0-9])) num=&quot;${1#-}&quot;; shift;;&apos;
shell.req: ERROR: /usr/src/tmp/mosquito-hive-buildroot/usr/share/mosquito-hive/rebuild-helper-one.sh: /bin/bash --rpm-requires failed
find-requires: ERROR: /usr/lib/rpm/shell.req failed
error: /bin/sh failed
error: Failed to find Requires


RPM build errors:
    /bin/sh failed
    Failed to find Requires

can be reproduced by running gear-hsh in mosquito-hive from http://git.altlinux.org/people/imz/public/mosquito-hive.git and is caused by code like http://git.altlinux.org/people/imz/public/mosquito-hive.git?p=mosquito-hive.git;a=blob;f=rebuild-helper-one.sh;h=e229ef04e9a03db69704de2be95773320ef2ea6f;hb=HEAD#l22 :

    shopt -s extglob

    case &quot;$1&quot; in
	-*([0-9])) num=&quot;${1#-}&quot;; shift;;
    esac

(*(fooBAR) is the special form from the extended globs. I use it substantially in other places of mosquito-hive; but, anyway, a correct bash script shouldn&apos;t break this mode. )</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>156862</commentid>
    <comment_count>1</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2016-05-19 16:08:48 +0300</bug_when>
    <thetext>A simple test case:

----extglob.sh-----
#!/bin/bash

shopt -s extglob

case foo in
    !(bar)) echo yes
    ;;
esac
--------------------

~/tests/test-sh $ bash --rpm-requires extglob.sh 
executable(/etc/bashrc)
extglob.sh: line 6: syntax error near unexpected token `(&apos;
extglob.sh: line 6: `    !(bar)) echo yes&apos;
~/tests/test-sh $ bash extglob.sh 
yes
~/tests/test-sh $</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>156863</commentid>
    <comment_count>2</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2016-05-19 17:08:57 +0300</bug_when>
    <thetext>An idea:

----extglob.sh-----
#!/bin/bash

shopt -s extglob

case foo in
    !(bar)) /bin/echo yes
    ;;
esac
--------------------

~/tests/test-sh $ bash --rpm-requires -O extglob extglob.sh
executable(/etc/bashrc)
executable(/bin/echo)

BTW, other cases with errors:

~/tests/test-sh $ bash -O extglob --rpm-requires extglob.sh
/bin/bash: --: invalid option
Usage:	/bin/bash [GNU long option] [option] ...
	/bin/bash [GNU long option] [option] script-file ...
GNU long options:
	--debug
	--debugger
	--dump-po-strings
	--dump-strings
	--help
	--init-file
	--login
	--noediting
	--noprofile
	--norc
	--posix
	--protected
	--rcfile
	--rpm-requires
	--restricted
	--verbose
	--version
	--wordexp
Shell options:
	-irsD or -c command or -O shopt_option		(invocation only)
	-abefhkmnptuvxBCHP or -o option
~/tests/test-sh $ 

----extglob.sh-----
#!/bin/bash -O extglob

shopt -s extglob

case foo in
    !(bar)) /bin/echo yes
    ;;
esac
--------------------

~/tests/test-sh $ ./extglob.sh 
/bin/bash: - : invalid option
Usage:	/bin/bash [GNU long option] [option] ...
	/bin/bash [GNU long option] [option] script-file ...
GNU long options:
	--debug
	--debugger
	--dump-po-strings
	--dump-strings
	--help
	--init-file
	--login
	--noediting
	--noprofile
	--norc
	--posix
	--protected
	--rcfile
	--rpm-requires
	--restricted
	--verbose
	--version
	--wordexp
Shell options:
	-irsD or -c command or -O shopt_option		(invocation only)
	-abefhkmnptuvxBCHP or -o option
~/tests/test-sh $</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>156908</commentid>
    <comment_count>3</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2016-05-21 22:06:56 +0300</bug_when>
    <thetext>The same problem has been discussed in https://lists.altlinux.org/pipermail/sisyphus/2012-August/358222.html -- at@ :

...

Выходит что, к сожалению, выполнение текущей команды может влиять
на синтаксический разбор последующей команды - получается такой недо-перл
(в перле команды, модифицирующие синтаксис, выполняются безусловно, даже в
режиме syntax check).

...

Простого способа передать &quot;-O extglob&quot; в shell.req пока нету.
Можно избирательно отключить поиск зависимостей в проблемном скрипте:
%add_findreq_skiplist */usr/bin/zpool_layout
либо менее избирательно:
AutoReq: yes, noshell
Тогда часть зависимостей, если в скриптах есть самостоятельные
нетривиальные зависимости, нужно будет написать вручную.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>156909</commentid>
    <comment_count>4</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2016-05-22 00:41:44 +0300</bug_when>
    <thetext>(In reply to comment #3)

&gt; Простого способа передать &quot;-O extglob&quot; в shell.req пока нету.

В bash4 можно будет сделать export BASHOPTS=extglob (или export BASHOPTS=&quot;$BASHOPTS:extglob&quot;) -- https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html .

Вообще-то, (когда это будет действовать в bash4) это похоже на ситуацию с LD_PRELOAD, который сначала люди экспортили из spec-а, но это было слишком грязно. Сделали механизм привязки желаемого значения переменной окружения к конкретным файлам, которые будут обрабатываться verify-elf. (Для lib.req почему-то такого желания остро не чувствовалось.) Тут аналогично для shell.req.

Т.е. если этот механизм обобщать до полезного в большем числе ситуаций, надо не зашивать в него конкретные имена переменных (как сейчас LD_PRELOAD, которое важно для тех, кто работает с ELF, а BASHOPTS будут для для shell.req), а привязывать к путям набор переменных с их значениями и заставить все RPM-скрипты их уважать и выставлять перед вызовом инструмента для обработки такого файла.

&gt; Можно избирательно отключить поиск зависимостей в проблемном скрипте:
&gt; %add_findreq_skiplist */usr/bin/zpool_layout
&gt; либо менее избирательно:
&gt; AutoReq: yes, noshell
&gt; Тогда часть зависимостей, если в скриптах есть самостоятельные
&gt; нетривиальные зависимости, нужно будет написать вручную.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>157014</commentid>
    <comment_count>5</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2016-05-25 20:39:14 +0300</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; 
&gt; &gt; Простого способа передать &quot;-O extglob&quot; в shell.req пока нету.
&gt; 
&gt; В bash4 можно будет сделать export BASHOPTS=extglob (или export
&gt; BASHOPTS=&quot;$BASHOPTS:extglob&quot;) --
&gt; https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html .

Сейчас в Sisyphus есть пакет bash4.

Если у Вас скрипты на bash4 (а ведь за этим будущее, и большинство скриптов должно становиться правильными bash4-скриптами), то в нынешней ситуации (т.е. когда bash -- это не bash4) с rpm-4.0.4-alt100.94 можно делать так:

* в shebang написать bash4
* в .spec-е экспортировать BASHOPTS:

# For shell.req:
%global __spec_autodep_custom_pre export BASHOPTS=extglob

Я так собрал пакет -- http://git.altlinux.org/people/imz/packages/mosquito-hive.git?p=mosquito-hive.git;a=commitdiff;h=c00c2380ca0b3529833d75b1ba3d6777dcccbd01 .</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>157053</commentid>
    <comment_count>6</comment_count>
      <attachid>6735</attachid>
    <who name="">alexey.tourbin</who>
    <bug_when>2016-05-26 21:32:57 +0300</bug_when>
    <thetext>Created attachment 6735
gear patch for bash4+

This patch might be redundant: only one hunk might be needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>157054</commentid>
    <comment_count>7</comment_count>
    <who name="">alexey.tourbin</who>
    <bug_when>2016-05-26 21:33:24 +0300</bug_when>
    <thetext>Имхо, нет смысла дальше поддерживать bash != bash4. Bash &lt; 4 прекратился обновляться уже почти 10 лет назад (версия 3.2 вышла в октябре 2006 года; дальше только errata и security fixes).

Я у себя на одной машине с альлинуксом уже второй год обновляю bash самостоятельно; сейчас это bash43-042. Кроме того, я сделал всего один подпакет - bash, и симлинк &quot;ln -s bash %buildroot/bin/sh&quot;. Я считаю, что всякие игры в другие шеллы неинтересны и никому не нужны. Люди рассчитывают на bash4+. (For the record, я также скептически отношусь к dash.)

Я столкнулся с тем, что в bash &lt; 4 не работают следующие вещи:
- доступ к массиву с конца; вот строчка кода, которую я написал:
w=1280 h=720 orig=(&quot;${orig[-1]}&quot; &quot;${orig[@]}&quot;)
- самое главное, &quot;wait -n&quot;, ожидание завершения первого процесса;
без этого примитива нельзя реализовать сложный пайплайн с параллельной обработкой каждой стадии; я где-то писал наброс на эту тему, кажется в группе ВКонтакте &quot;Типичный Линукс&quot;, но сейчас не смог его найти.

К сожалению, если обновить системный bash до bash4+, то часть скриптов в альт линуксе перестает работать. К счастью, этих скриптов не так много. Разозлил меня один раз только gear(1), где используется eval. Методом исправления по-живому &quot;sudo vim&quot; я его немного подправил, и вроде он заработал.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>157074</commentid>
    <comment_count>8</comment_count>
    <who name="Ivan Zakharyaschev">imz</who>
    <bug_when>2016-05-27 14:52:23 +0300</bug_when>
    <thetext>(In reply to comment #7)

&gt; К сожалению, если обновить системный bash до bash4+, то часть скриптов в альт
&gt; линуксе перестает работать. К счастью, этих скриптов не так много. Разозлил
&gt; меня один раз только gear(1), где используется eval. Методом исправления
&gt; по-живому &quot;sudo vim&quot; я его немного подправил, и вроде он заработал.

Записал в https://bugzilla.altlinux.org/show_bug.cgi?id=32147 (про gear)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>157082</commentid>
    <comment_count>9</comment_count>
    <who name="">alexey.tourbin</who>
    <bug_when>2016-05-27 16:50:52 +0300</bug_when>
    <thetext>&gt; Записал в https://bugzilla.altlinux.org/show_bug.cgi?id=32147 (про gear)

Запишите еще, что всё остальное с bash4 более-менее работает; если у меня попросят еще один unrelated patch насчет bash4, то я очень затруднюсь. Хост-система загружается, по крайней мере.

Проблема обновления bash4 - мне кажется, это проблема политической воли и пассионарности генерального конструктора. Генеральный конструктор пробовал года два назад собирать bash4, но потом бросил git.altlinux.org/gears/b/bash4.git

Новые дистрибутивы имеют все шансы выйти с интерпретатором /bin/bash десятилетней давности. Мне кажется, эта перспектива не имеет никакого рационального обоснования.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>166413</commentid>
    <comment_count>10</comment_count>
    <who name="Evgeniy Korneechev">ekorneechev</who>
    <bug_when>2017-10-20 11:48:12 +0300</bug_when>
    <thetext>(В ответ на комментарий №7)
&gt; Я столкнулся с тем, что в bash &lt; 4 не работают следующие вещи:
&gt; - доступ к массиву с конца; вот строчка кода, которую я написал:
&gt; w=1280 h=720 orig=(&quot;${orig[-1]}&quot; &quot;${orig[@]}&quot;)
&gt; - самое главное, &quot;wait -n&quot;, ожидание завершения первого процесса;

еще например, объявление словаря (ассоциативного массива) ...
$ declare -A array
bash: declare: -A: неправильная опция
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176886</commentid>
    <comment_count>11</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2018-12-21 01:19:51 +0300</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; 
&gt; &gt; Простого способа передать &quot;-O extglob&quot; в shell.req пока нету.
&gt; 
&gt; В bash4 можно будет сделать export BASHOPTS=extglob (или export
&gt; BASHOPTS=&quot;$BASHOPTS:extglob&quot;) --
&gt; https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html .

Нет, bash4 это явно запрещает.

$ bash --version
GNU bash, version 4.4.23(1)-release (x86_64-alt-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ bash -c &apos;BASHOPTS=extglob; echo OK&apos;; echo $?
bash: BASHOPTS: readonly variable
1</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>6735</attachid>
            <date>2016-05-26 21:32:57 +0300</date>
            <delta_ts>2016-05-26 21:32:57 +0300</delta_ts>
            <desc>gear patch for bash4+</desc>
            <filename>gear.patch</filename>
            <type>text/plain</type>
            <size>627</size>
            <attacher>alexey.tourbin</attacher>
            
              <data encoding="base64">LS0tIC91c3IvYmluL2dlYXItc2gtZnVuY3Rpb25zLQkyMDE2LTAyLTAyIDE1OjAzOjMzLjAwMDAw
MDAwMCArMDAwMAorKysgL3Vzci9iaW4vZ2Vhci1zaC1mdW5jdGlvbnMJMjAxNi0wMy0wOCAxMToy
OTo0Ni4yODk2MjUzNzQgKzAwMDAKQEAgLTY5LDcgKzY5LDcgQEAgdW5pbnN0YWxsX2NsZWFudXBf
aGFuZGxlcigpCiAjIDJucyBhcmcgaXMgdGhlIG5hbWUgb2YgdmFyaWFibGUgdGhhdCBjb250YWlu
cyB0aGUgdmFsdWUgdG8gYmUgYXNzaWduZWQuCiBzZXRfdmFyX3ZhbHVlKCkKIHsKLQlldmFsICIk
MT1cIlwkJDJcIiIKKwlldmFsICIkMT1cIlwkeyQyLX1cIiIKIH0KIAogbGluZW5vPQpAQCAtNDQ0
LDYgKzQ0NCw3IEBAIGRpc2FibGVfc3BlY3N1YnN0PQogZ2V0X3NwZWNzdWJzdF9mcm9tX3J1bGVz
KCkKIHsKIAlpZiBbIC16ICIkZGlzYWJsZV9zcGVjc3Vic3QiIF07IHRoZW4KKwkJbG9jYWwgc3Bl
Y3N1YnN0PQogCQlnZXRfdW5pcV9kaXJlY3RpdmVfZnJvbV9ydWxlcyBzcGVjc3Vic3Qgc3BlY3N1
YnN0CiAJCWlmIFsgLW4gIiRzcGVjc3Vic3QiIF07IHRoZW4KIAkJCVsgLXogIiQocHJpbnRmICVz
ICIkc3BlY3N1YnN0IiB8TEFORz1DIHRyIC1kICdbOmFsbnVtOl1fWzpzcGFjZTpdJykiIF0gfHwK
</data>

          </attachment>
      

    </bug>

</bugzilla>