Относительно ошибки «неожиданное перенаправление»:
Это не относится к stable
, оно связано с вашим сценарием, использующим /bin/sh
, а не bash
.Синтаксис <()
недоступен в оболочках POSIX, который включает bash при вызове как /bin/sh
(в этом случае он отключает нестандартную функциональность по соображениям совместимости).
Сделайте строку shebang #!/bin/bash
.
Понимание идиомы < <()
:
Чтобы понять, что происходит - <()
заменяется именем файла, которое относится к выводу команды, которую он выполняет;в Linux это обычно имя файла типа /dev/fd/##
.Запустив < <(command)
, вы берете этот файл и направляете его на ваш стандартный ... что довольно близко к поведению канала.
Чтобы понять, почему эта идиома полезна, сравните это:
read foo < <(echo "bar")
echo "$foo"
к этому:
echo "bar" | read foo
echo "$foo"
Первый работает, потому что чтение выполняется той же оболочкой, которая позже повторяет результат.Последнее не происходит, поскольку чтение выполняется в подоболочке, которая была создана только для настройки конвейера, а затем уничтожена, поэтому переменная больше не присутствует для последующего эха.
Понимание bash -s stable
:
bash -s
указывает на то, что запускаемый скрипт войдет в stdin.Все аргументы затем передаются в сценарий в массиве $@
($1
, $2
и т. Д.), Поэтому stable
становится $1
при запуске сценария, введенного в stdin.