URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 132171
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Устранение ошибки redirection unexpected в bash-скриптах"

Отправлено auto_tips , 26-Ноя-23 11:12 
На системе с bash 5.2.15(1)-release совершенно невинное выражение

   read id rest < <(qm list)

вызывает ошибку "Syntax error: redirection unexpected"

Лечится заменой shebang с #!/bin/bash на #!/usr/bin/bash
Вроде бы потому, что whois bash отдаёт /usr/bin/bash.

Но ирония в том, что /bin/bash и /usr/bin/bash - две идентичные копии, даже не симлинк. /usr/bin в PATH стоит перед /bin.

URL:
Обсуждается: http://www.opennet.dev/tips/info/3235.shtml


Содержание

Сообщения в этом обсуждении
"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено onanim , 26-Ноя-23 11:12 
что за конструкция "<(qm list)"?
может, там должно быть "$(qm list)", от того башу и непонятен второй редирекшон?


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено gg , 26-Ноя-23 15:39 
The <(list) syntax is supported by both, bash and zsh. It provides a way to pass the output of a command (list) to another command when using a pipe (|) is not possible. For example when a command just does not support input from STDIN or you need the output of multiple commands:

diff <(ls dirA) <(ls dirB)


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено ACCA , 27-Ноя-23 06:29 
Там проблема не в том, что pipe is not possible, а в том, что


qm list | read id rest

приведёт к дикой проблеме. qm list исполняется в текущем shell. А то, что после pipe - в его форке. Поэтом $id и $rest никак не вернутся в текущий shell.


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Омномно , 19-Дек-23 15:53 
read -r id rest <<__EODATA__
$(qm list)
__EODATA__

"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 19-Дек-23 18:07 
> исполняется в текущем shel

shopt -s lastpipe


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено OpenEcho , 26-Ноя-23 18:16 
Может это qm list хулиганит, a не bash?


```
#!/bin/bash

read id rest < <( echo "a b"; )

echo "=== as expected ==="
echo "[${id}]"
echo "[${rest}]"

```


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено ACCA , 27-Ноя-23 06:33 
Это тебе повезло, что /bin/bash оказался первым в $PATH.


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 26-Ноя-23 21:07 
чёт не работает:

bash: /tmp/1.sh: cannot execute: required file not found

но, вообще, я находил регрессии в баше (пришлось заменять $() на обратные кавычки в коде чтобы extglob с ?() не отваливался), по-моему, это только в 5.2 на каком-то патче началось.

а, вот, комментарий гласит it's impossible to use ?() inside $() in 5.2_p12 так что могут быть баги баша


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено ACCA , 27-Ноя-23 12:02 
Про этот баг говорят с 2008 года - https://unixforum.org/viewtopic.php?t=74172

"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 26-Ноя-23 21:48 
> ирония в том, что /bin/bash и /usr/bin/bash
> - две идентичные копии, даже не симлинк.

А что за система такая чудесатая? Конечно круто глобальные выводы сделать - но например в Debian 12 (и деривативах типа убунт, минтов и проч) - вы не создадите "/bin/bash" даже если бы и сильно захотели. Просто потому что "merged USR" где /bin это symlink -> /usr/bin и соответственно вот именно файлом, вот именно в том пути оно ну никак быть не может, чисто технически.

А вот что за дистро так прикалывается с копиями интерпретеров - имена героев в студию.


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено ACCA , 27-Ноя-23 06:25 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"

ProxMox 8.0.3


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 19-Дек-23 18:09 
А точно копия? Может, одна версия статически собрана, а другая раздельно?


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 28-Ноя-23 01:53 
> Лечится заменой shebang с #!/bin/bash на #!/usr/bin/bash

В шебанге шелл-скриптов позволительны всего две вещи:

  #!/bin/sh -- если это кроссплатформенный скрипт,
  #!/usr/bin/env bash -- если нужен именно баш.

/bin/sh прямо упоминается в документации к стандартной библиотеке языка си, поэтому он будет гарантированно существовать. А про /bin/bash таких гарантий нет. Как и для /usr/bin/bash. Поэтому следует использовать /usr/bin/env.

Далее. NixOS для абсолютно минимальной совместимости со скриптами именно эти два файла и оставляет: в папке /bin нет ничего, кроме /bin/sh, а в папке /usr (да, именно в /usr, а не в /usr/bin) нет ничего, кроме /usr/bin/env.


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено ACCA , 03-Дек-23 06:37 
Вот же жопа. Когда-то мы были бандой маргиналов, протестующий против засилья NetWare и MS-DOS.

А теперь стали старыми пердунами. Ты прав, мой собрат препод. Только никто не хочет вспоминать про /usr/bin/env.


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 09-Дек-23 14:22 
> Только никто не хочет вспоминать про /usr/bin/env.

Всё кто серьезно с системой работает знают как делать нужно.
Но всё больше "ыкспертов из отрасли", которые получают знания через посты в телеграмме, а не чтение документации.


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 19-Дек-23 18:12 
Эту байку любят рассказывать только в NixOS. Где забили на FHS, и все пути превратили в кашу из хэшей. И теперь страдают. У нормальных людей работает и /usr/bin/bash. И всё гарантируется - правилами пакетирования для сопроводителей и разработчиков дистрибутива.

"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Аноним , 03-Янв-24 02:05 
У нормальных людей сработает только /bin/bash, ты палишься. А так, конечно, зависит от того, где планируется запускать, с env не в пример универсальнее.

"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено glad_valakas , 07-Дек-23 20:23 
> whois bash

which bash

> read id rest < <(qm list)

не знаю что это.
можно в терминах /bin/sh пояснить, для тупых и wannabe-кроссплатформенных ?


"Устранение ошибки redirection unexpected в bash-скриптах"
Отправлено Электрон , 09-Дек-23 06:49 
command -v bash # пожайлуста!