The OpenNET Project / Index page

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

Устранение ошибки redirection unexpected в bash-скриптах
На системе с 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.
 
23.11.2023 , Автор: Аноним
Ключи: bash / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / Shell / Готовые скрипты

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, onanim (?), 11:12, 26/11/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    что за конструкция "<(qm list)"?
    может, там должно быть "$(qm list)", от того башу и непонятен второй редирекшон?

     
     
  • 2.2, gg (??), 15:39, 26/11/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    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)

     
     
  • 3.7, ACCA (ok), 06:29, 27/11/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Там проблема не в том, что pipe is not possible, а в том, что




    qm list | read id rest


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

     
     
  • 4.15, Омномно (?), 15:53, 19/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    read -r id rest <<__EODATA__
    $(qm list)
    __EODATA__
     
  • 4.16, Аноним (16), 18:07, 19/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > исполняется в текущем shel

    shopt -s lastpipe

     

  • 1.3, OpenEcho (?), 18:16, 26/11/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Может это qm list хулиганит, a не bash?


    '''
    #!/bin/bash

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

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

    '''

     
     
  • 2.8, ACCA (ok), 06:33, 27/11/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Это тебе повезло, что /bin/bash оказался первым в $PATH.

     

  • 1.4, Аноним (4), 21:07, 26/11/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    чёт не работает:

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

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

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

     
     
  • 2.9, ACCA (ok), 12:02, 27/11/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Про этот баг говорят с 2008 года - https://unixforum.org/viewtopic.php?t=74172
     

  • 1.5, Аноним (5), 21:48, 26/11/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > ирония в том, что /bin/bash и /usr/bin/bash
    > - две идентичные копии, даже не симлинк.

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

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

     
     
  • 2.6, ACCA (ok), 06:25, 27/11/2023 [^] [^^] [^^^] [ответить]  
  • +/
    PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"

    ProxMox 8.0.3

     
     
  • 3.17, Аноним (16), 18:09, 19/12/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А точно копия? Может, одна версия статически собрана, а другая раздельно?

     

  • 1.10, Аноним (10), 01:53, 28/11/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Лечится заменой 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.

     
     
  • 2.11, ACCA (ok), 06:37, 03/12/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот же жопа. Когда-то мы были бандой маргиналов, протестующий против засилья NetWare и MS-DOS.

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

     
     
  • 3.14, Аноним (14), 14:22, 09/12/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Только никто не хочет вспоминать про /usr/bin/env.

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

     
  • 2.18, Аноним (16), 18:12, 19/12/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Эту байку любят рассказывать только в NixOS. Где забили на FHS, и все пути превратили в кашу из хэшей. И теперь страдают. У нормальных людей работает и /usr/bin/bash. И всё гарантируется - правилами пакетирования для сопроводителей и разработчиков дистрибутива.
     
     
  • 3.19, Аноним (4), 02:05, 03/01/2024 [^] [^^] [^^^] [ответить]  
  • +/
    У нормальных людей сработает только /bin/bash, ты палишься. А так, конечно, зависит от того, где планируется запускать, с env не в пример универсальнее.
     

  • 1.12, glad_valakas (?), 20:23, 07/12/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > whois bash

    which bash

    > read id rest < <(qm list)

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

     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




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

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