Назад | Перейти на главную страницу

Почему я получаю sh: / dev / fd / 63: Permission denied process substitution (анонимный канал)

У меня есть сценарий оболочки, который добавляет пользователей из csv в работающий экземпляр nextcloud. Экземпляр nextcloud работает внутри контейнеров докеров. По какой-то причине я получаю сообщение об ошибке из строки, в которой используется подстановка процесса <(анонимный канал). Помимо ошибок, которые я получаю, сценарий делает все, что я от него ожидаю. Даже с ошибками пользователи добавляются, и я не вижу побочных эффектов. Любые идеи? Вот мой сценарий.

#!/bin/bash
input_file="./users.csv"

#   Input File
#   jack,Jack Ripper,test_group,
#   jill,Jill Ripper,test_group,
#   johny,Johny Appleseed,test_group,

while IFS=, read -r f1 f2 f3
do

<(docker-compose exec -T --env OC_PASS=nomoremonkeysjumpingonthebed --user www-data app php occ \
    user:add --password-from-env --display-name="${f2}" --group="${f3}" "$f1" )

done <"$input_file"

exit 0

Когда я запускаю этот сценарий, я получаю следующее на stdout.

./batch_users.sh: line 11: /dev/fd/63: Permission denied
./batch_users.sh: line 11: /dev/fd/63: Permission denied
./batch_users.sh: line 11: /dev/fd/63: Permission denied

Все очень просто. Ваш сценарий на самом деле пытается ВЫПОЛНИТЬ именованный канал. Подстановка процесса <() используется для подстановки файлов, обычно используется в качестве аргументов команд. Как автономный файл в строке, он сам по себе становится командой, и вы получаете ошибку «доступ запрещен», поскольку именованные каналы не являются исполняемыми.

Я действительно не знаю, чего вы здесь пытаетесь достичь, поэтому я не могу предложить вам исправление, но то, что вы делаете, определенно неправильно.

Если кто-то наткнется на это в будущем и захочет использовать мой оригинальный сценарий, вот лучший способ.

#!/bin/bash

input_file="./users.csv"

#   Input File
#   Jack Ripper,jack,test_group
#   Jill Ripper,jill,test_group
#   Johny Appleseed,johny,test_group

while IFS=, read -r f1 f2 f3
do
sh -c "docker-compose exec -T --env OC_PASS=nomoremonkeysjumpingonthebed --user www-data app php occ \
    user:add --password-from-env --display-name=\"${f1}\" --group=\"${f3}\" \"$f2\" " < /dev/null
done <"$input_file"
exit 0

Больше не использовать замену процесса, которая в данном случае является гораздо лучшим вариантом.