The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Доступен ShellCheck 0.9, статический анализатор для shell-скриптов, opennews (??), 27-Дек-22, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


124. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (123), 28-Дек-22, 09:26 
Покажи код, аноним. Баш не должен фейлиться на $() никогда.
Ответить | Правка | Наверх | Cообщить модератору

132. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (60), 28-Дек-22, 14:39 
Да, я тоже думал проблема может быть в другом месте, но она именно тут (похоже, дело именно во вложенной ?(), но если с ней что-нибудь сделать, glob не будет работать, как надо)

line 90: syntax error near unexpected token `('

shopt -s extglob
fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("${BASH_REMATCH[1]}")"${BASH_REMATCH[2]}${BASH_REMATCH[3]}"$pext)
[[ 0 -ne $? ]] && echo '#glob match failed' && exitnow
shopt -u extglob

До bash-5.2 всё было норм, 0 проблем с файлами. Этот скрипт генерирует страничку для веббраузера, и в один прекрасный день он просто перестал это делать(

Ответить | Правка | Наверх | Cообщить модератору

163. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от швондер (?), 29-Дек-22, 12:02 
>[оверквотинг удален]
> именно тут (похоже, дело именно во вложенной ?(), но если с
> ней что-нибудь сделать, glob не будет работать, как надо)
> line 90: syntax error near unexpected token `('
> shopt -s extglob
> fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("${BASH_REMATCH[1]}")"${BASH_REMATCH[2]}${BASH_REMATCH[3]}"$pext)
> [[ 0 -ne $? ]] && echo '#glob match failed' && exitnow
> shopt -u extglob
> До bash-5.2 всё было норм, 0 проблем с файлами. Этот скрипт генерирует
> страничку для веббраузера, и в один прекрасный день он просто перестал
> это делать(

У меня ваш код работает ожидаемо в GNU bash, версия 5.1.16(1)-release (x86_64-pc-linux-gnu)

в 5.1 эта ошибка синтаксиса вылетает, если extglob не задавать, "?()" будет некорректным. Ваш пример загрязнен BASH_REMATCH и прочими неимеющими отношения к вопросу деталями. это затрудняет диагностику.
Могу предположить, что если у вас вылетает не описанная вами ошибка про line 90, но просто не находится файл, то беда в том, что нет матча на содержимое ?(), при failglob будет ошибка матчинга. То есть, вы указали что мол вам и не нужно то, что в скобках, но это все равно будет fail globbing.
В генте 5.2 ещё маскирован, как обновится - проверю ещё раз ваш кейз. Должен работать.

Ответить | Правка | Наверх | Cообщить модератору

164. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (60), 29-Дек-22, 12:31 
Нет, баш в генте 5.2 в тестовой ветке, не замаскирован. Я уже говорил, что в синтетическом примере не проявляется, поэтому нет смысла. Это была копия проблемного кода и я отдельно убедился, что дело именно в нём. Баш вообще не пытается исполнить этот файл, поэтому переменные никакого значения не имеют.
Ответить | Правка | Наверх | Cообщить модератору

173. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от швондер (?), 31-Дек-22, 17:27 
> Нет, баш в генте 5.2 в тестовой ветке, не замаскирован. Я уже
> говорил, что в синтетическом примере не проявляется, поэтому нет смысла. Это
> была копия проблемного кода и я отдельно убедился, что дело именно
> в нём. Баш вообще не пытается исполнить этот файл, поэтому переменные
> никакого значения не имеют.

не поленился, собрал локально 5.2 в хомовике, сделал минимальный сампл на базе вашего кода, накидал файликов под матч ?() - вижу пока одно и то же поведение как с системным 5.1, так и с bash-5.2/bash.

Ответить | Правка | Наверх | Cообщить модератору

165. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (60), 29-Дек-22, 12:35 
Кстати local pext='@(*.mkv|*.mp4|*.avi)' поэтому да, extglob.
Ответить | Правка | К родителю #163 | Наверх | Cообщить модератору

172. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от швондер (?), 31-Дек-22, 17:23 
так у вас какая именно ошибка? Вижу две в вашем сообщении
1. некорректный синтаксис line 90  -это очень похоже на отключенный extglob
2. файл не находится
Если 2 это следствие №1, то это одна ситуация. Если №2 на одном и том же наборе файлов и минимальном пруфе работает по разному на разных версиях баша  - это надо репортить.
Давайте запилим минимальный пруфик бага?
Ответить | Правка | Наверх | Cообщить модератору

174. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (60), 31-Дек-22, 21:11 
Файл находится в 5.1 и не находится в 5.2? И при чём тут файл, если баш не пытается выполнять этот код, который ему не нравится? В этом у баша большая проблема, если ему что-то не нравится, приходится играть в угадайку. Технически этот код подстановки заранее неизвестного имени даже не использовался, потому что скрипту надо передать каталог вместо файла и это никогда так и не использовалось. Но, я уверен, что он корректный и всё работает, как и ожидалось, специально это проверил. Тут большая проблема, что extglob не работает корректно с @ в имени. Просто внезапно баш после обновления решил, что надо использовать обратные кавычки тут. Выглядит 100% как баг, или регрессия.

Вот полный пример кода, в котором $() не работает, но кавычки работают как и с 5.1.

#!/bin/env bash

process_dirname(){
    local pext='@(*.mkv|*.mp4|*.avi)'
    shopt -s extglob
    fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("123")"qwe"$pext)
    [[ 0 -ne $? ]] && echo '#glob match failed' && exit 1
    shopt -u extglob

    if [[ ! -f "${fname}" ]];then
        echo "new filename ${fname@Q} couldn't be located, didn't guess the filename correctly"
        exit 1
    fi
    echo "# filename for ${file@Q} changed to ${fname@Q}"
}

file="$@"
[[ -n "${file}" ]] || { echo -e "Usage:\t$0 FILENAME"; exit 1; }

fname="${file##*/}"
fpath="${file%/*}"
[[ -d "${fname}" ]] && process_dirname

Ещё раз, дело именно в синтаксической ошибке от $(?()) и не в чём-либо ещё.

Ответить | Правка | Наверх | Cообщить модератору

175. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от швондер (?), 01-Янв-23, 12:23 
>[оверквотинг удален]
>     echo "# filename for ${file@Q} changed to ${fname@Q}"
> }
> file="$@"
> [[ -n "${file}" ]] || { echo -e "Usage:\t$0 FILENAME"; exit 1;
> }
> fname="${file##*/}"
> fpath="${file%/*}"
> [[ -d "${fname}" ]] && process_dirname
> Ещё раз, дело именно в синтаксической ошибке от $(?()) и не в
> чём-либо ещё.

вы не поверите, но этот код зависит от файлов, которые находятся - или не находятся. Предлагаю собрать локально 5.2 и 5.1, и убедиться, что оба интерпретатора работают идентично, вызывая прямо ~/src/bash-5.1/bash ./script.sh и ~/src/bash-5.2/bash ./script.sh
Трюк с VAR=$(echo $VAR) это фактически аналог разыменовывания указателя, получения конкретного значения переменной, вместо вычисления переменной каждый раз. Именно для него вам понадобились здесь shopt. В тонком месте и порвалось, ни одно кодеревью этот код не прошел бы; но всё-таки, врядли дело в версии баш. прошу проверить через выполнение именно разными версиями, установленными локально. С новым годом!

Ответить | Правка | Наверх | Cообщить модератору

176. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (60), 01-Янв-23, 13:14 
Этот код ни от чего не зависит, если он не интерпретируется. Не понимаю, что тонкого в ?(), если extglob -- это штатная функциональность баша? Я уже уже собирал баш 5.0_p18 и 5.1_p16-r2 -- в них нет ошибки синтаксиса, которая возникла сразу после размаскировки 5.2_p15 пару месяцев назад. Более ранние рассматривать нет смысла, в остальном коде присутствует максимально много башизмов, потому что только они позволяют писать профессиональный и устойчивый к ошибкам и уязвимостям код без лишних зависимостей (у которых будут свои особенности опять же). Конкретно приведённый код демонстрирует эту ошибку в 5.2_p15, её там быть не должно, либо $() вообще нельзя использовать нигде и никак.
Ответить | Правка | Наверх | Cообщить модератору

177. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от швондер (?), 01-Янв-23, 14:49 
> Этот код ни от чего не зависит, если он не интерпретируется. Не
> понимаю, что тонкого в ?(), если extglob -- это штатная функциональность
> баша? Я уже уже собирал баш 5.0_p18 и 5.1_p16-r2 -- в
> них нет ошибки синтаксиса, которая возникла сразу после размаскировки 5.2_p15 пару
> месяцев назад. Более ранние рассматривать нет смысла, в остальном коде присутствует
> максимально много башизмов, потому что только они позволяют писать профессиональный и
> устойчивый к ошибкам и уязвимостям код без лишних зависимостей (у которых
> будут свои особенности опять же). Конкретно приведённый код демонстрирует эту ошибку
> в 5.2_p15, её там быть не должно, либо $() вообще нельзя
> использовать нигде и никак.

пруф должен выглядеть так:
mkdir test
cd test
mkdir dir
touch dir/{имена_файлов_под_матч}
~/src/bash-5.1/bash ~/src/script  - работает
~/src/bash-5.2/bash ~/src/script  - не работает


пока этого нет - говорить о регрессе бессмысленно.

Ответить | Правка | Наверх | Cообщить модератору

178. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (60), 01-Янв-23, 15:19 
Зачем мне это? Я накатил старые версии интерпретатора, которые есть в репах, и убедился, что у них всё нормально. Этого более чем достаточно. Но ладно

https://ftp.gnu.org/gnu/bash/bash-5.2.15.tar.gz

~ $ ./configure
~ $ make
~ $ ./bash -x ~/bin/bashextglob.sh 123
~/bin/bashextglob.sh: line 6: syntax error near unexpected token `('
~/bin/bashextglob.sh: line 6: `    fname=$(shopt -s failglob;shopt -s nocaseglob;echo "${fname}"/?("123")"qwe"$pext)'

ожидаемый результат выглядит вот так

~ $ bash -x ~/bin/shitsniffer3.sh 123
+ file=123
+ [[ -n 123 ]]
+ fname=123
+ fpath=123
+ [[ -d 123 ]]

Сколько раз надо повторить, что дело не в файлах? Это уже 10 вроде.

Ответить | Правка | Наверх | Cообщить модератору

179. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от швондер (?), 01-Янв-23, 18:29 
>[оверквотинг удален]
> "${fname}"/?("123")"qwe"$pext)'
> ожидаемый результат выглядит вот так
> ~ $ bash -x ~/bin/shitsniffer3.sh 123
> + file=123
> + [[ -n 123 ]]
> + fname=123
> + fpath=123
> + [[ -d 123 ]]
> Сколько раз надо повторить, что дело не в файлах? Это уже 10
> вроде.

так у вас разные скрипты вызываются?

Ответить | Правка | Наверх | Cообщить модератору

180. "Доступен ShellCheck 0.9, статический анализатор для shell-ск..."  +/
Сообщение от Аноним (60), 01-Янв-23, 18:36 
Нет, это один файл. Я же написал, как повторить (когда я пытался воспроизвести на минимальном примере в прошлый раз, почему-то не получилось).
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру