У меня есть сценарий оболочки, который добавляет пользователей из 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
Больше не использовать замену процесса, которая в данном случае является гораздо лучшим вариантом.