为什么我收到 sh: /dev/fd/63: 权限被拒绝进程替换(匿名管道)

为什么我收到 sh: /dev/fd/63: 权限被拒绝进程替换(匿名管道)

我有一个 shell 脚本,可以将用户从 csv 添加到正在运行的 nextcloud 实例。nextcloud 实例在 docker 容器内运行。出于某种原因,我从使用进程替换 <(匿名管道) 的行中收到错误。除了我收到的错误之外,该脚本完成了我期望的一切。即使有错误,用户也会被添加,我看不到任何不良副作用。有什么想法吗?这是我的脚本。

#!/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

当我运行该脚本时,我在标准输出上得到以下内容。

./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

答案1

这很简单。您的脚本实际上是在尝试执行命名管道。<() 进程替换用于替换文件,通常用作命令的参数。作为一行上的独立文件,它本身就成为一个命令,并且您会收到“权限被拒绝”错误,因为命名管道不可执行。

我真的不知道你在这里想要完成什么,所以我无法给你提供纠正,但你所做的肯定是不对的。

答案2

如果将来有人偶然发现这个问题并想使用我原来的脚本,这里有一个更好的方法。

#!/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

不再使用流程替代,在这种情况下,这是一个更好的选择。

相关内容