На системе с 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
что за конструкция "<(qm list)"?
может, там должно быть "$(qm list)", от того башу и непонятен второй редирекшон?
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)
Там проблема не в том, что pipe is not possible, а в том, что
qm list | read id restприведёт к дикой проблеме. qm list исполняется в текущем shell. А то, что после pipe - в его форке. Поэтом $id и $rest никак не вернутся в текущий shell.
read -r id rest <<__EODATA__
$(qm list)
__EODATA__
> исполняется в текущем shelshopt -s lastpipe
Может это qm list хулиганит, a не bash?
```
#!/bin/bashread id rest < <( echo "a b"; )
echo "=== as expected ==="
echo "[${id}]"
echo "[${rest}]"```
Это тебе повезло, что /bin/bash оказался первым в $PATH.
чёт не работает:bash: /tmp/1.sh: cannot execute: required file not found
но, вообще, я находил регрессии в баше (пришлось заменять $() на обратные кавычки в коде чтобы extglob с ?() не отваливался), по-моему, это только в 5.2 на каком-то патче началось.
а, вот, комментарий гласит it's impossible to use ?() inside $() in 5.2_p12 так что могут быть баги баша
Про этот баг говорят с 2008 года - https://unixforum.org/viewtopic.php?t=74172
> ирония в том, что /bin/bash и /usr/bin/bash
> - две идентичные копии, даже не симлинк.А что за система такая чудесатая? Конечно круто глобальные выводы сделать - но например в Debian 12 (и деривативах типа убунт, минтов и проч) - вы не создадите "/bin/bash" даже если бы и сильно захотели. Просто потому что "merged USR" где /bin это symlink -> /usr/bin и соответственно вот именно файлом, вот именно в том пути оно ну никак быть не может, чисто технически.
А вот что за дистро так прикалывается с копиями интерпретеров - имена героев в студию.
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"ProxMox 8.0.3
А точно копия? Может, одна версия статически собрана, а другая раздельно?
> Лечится заменой 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.
Вот же жопа. Когда-то мы были бандой маргиналов, протестующий против засилья NetWare и MS-DOS.А теперь стали старыми пердунами. Ты прав, мой собрат препод. Только никто не хочет вспоминать про /usr/bin/env.
> Только никто не хочет вспоминать про /usr/bin/env.Всё кто серьезно с системой работает знают как делать нужно.
Но всё больше "ыкспертов из отрасли", которые получают знания через посты в телеграмме, а не чтение документации.
Эту байку любят рассказывать только в NixOS. Где забили на FHS, и все пути превратили в кашу из хэшей. И теперь страдают. У нормальных людей работает и /usr/bin/bash. И всё гарантируется - правилами пакетирования для сопроводителей и разработчиков дистрибутива.
У нормальных людей сработает только /bin/bash, ты палишься. А так, конечно, зависит от того, где планируется запускать, с env не в пример универсальнее.
> whois bashwhich bash
> read id rest < <(qm list)
не знаю что это.
можно в терминах /bin/sh пояснить, для тупых и wannabe-кроссплатформенных ?
command -v bash # пожайлуста!