Bash shell脚本语法问题:Target不是目录吗?

use*_*069 2 bash shell

我试图将文件复制到目录中的一堆文件夹.文件夹已保存,propagation.txt如下所示:

sfproject/folder1
sfproject/folder2
Run Code Online (Sandbox Code Playgroud)

我试图运行的代码是:

for x in `cat propagation.txt`
do cp php.ini $x ; echo "Copied php.ini to $x"
done
echo "Finished"; 
Run Code Online (Sandbox Code Playgroud)

但是,它指出:

cp : 'target: 'propagation.txt' is not a text'
Run Code Online (Sandbox Code Playgroud)

这就是propagation.txt包含:

sfproject/apps/backend/modules/users/lib
sfproject/apps/backend/templates
sfproject/apps/frontend/config
sfproject/apps/frontend/lib
sfproject/apps/frontend/modules/EdboostSatGuide/actions
sfproject/apps/frontend/modules/EdboostSatGuide/templates
sfproject/apps/frontend/modules/dashboard/actions
sfproject/apps/frontend/modules/dashboard/templates
sfproject/apps/frontend/modules/quizzes/actions
sfproject/apps/frontend/modules/quizzes/templates
sfproject/apps/frontend/templates
sfproject/cache/frontend/prod/config
Run Code Online (Sandbox Code Playgroud)

Kaz*_*Kaz 7

"目标不是目录"是一个cp错误.当你有三个或更多参数时会发生这种情况,最后一个参数是一个不是目录的现有文件系统对象!

当然

cp ab

如果b是常规文件,则工作,而不是目录.b简单地替换为a.但

cp abc

意味着使一个副本ab目录里面c.

目前还不清楚这个问题是如何发生的cp php.ini $x,因为循环变量$x正在迭代cat ...过程替换的结果.过程替换经历了单词拆分,并且拆分件被x逐个分配.为了cp最终得到三个或更多的参数,$x必须以某种方式扩展为两个参数.

发布失败的实际逐字代码和一些示例数据.

在相关的说明中,如果在某些路径名中确实有空格,最好将它们放在单独的行中propagation.txt,然后像这样处理它:

# read dir names one by one and copy php.ini into them ...
while read dir ; do
    cp php.ini "$dir"
    # ...
done < propagation.txt  # ... getting the names from propagation.txt
Run Code Online (Sandbox Code Playgroud)