我正在努力通过在真正的 x 应用程序等中实现一些脚本来使它们更加优雅......
在脚本中的某个时刻,我们基本上希望从已安装的可移动存储设备中获取所有内容,并将其复制到 tmp 工作文件夹中的指定文件夹中。在 shell 中执行时,它可以顺利运行。当从代码执行时,它会失败。
复制命令:
cp -avfr /tmp/mnt221234jk/* /tmp/mnt23255/disk1/
我从本机应用程序得到的错误是:
cp: cannot stat: '/tmp/mnt221234jk/*' file not found.
奇怪的是,它绝对存在,对运行应用程序的用户具有适当的权限等。我可以stat /tmp/mnt221234jk/*
从 shell 中运行 cp 命令,并且两者都可以正常工作。
除此之外,如果我/*
从文件复制源中省略 ,它可以工作,但会在目标中创建一个新文件夹,mnt221234jk
其名称不是我要查找的名称。
一些旁注:我执行 shell 命令的代码绝对有效,并且运行良好。但需要工作路径或类似的东西很可能有些奇怪。
未能根据文件不存在进行统计错误是否会给任何人敲响警钟?
如果有替代的 shell 命令可以使用权限等有效地递归复制文件结构,我愿意尝试以不同的方式实现这一点。
答案1
遇到问题的脚本中的调用不是通配文件,而是 shell 执行的。我不太清楚你如何调用它,但你需要找到一种方法来遍历或循环文件。
答案2
好吧,我提前道歉,真正的问题实际上非常简单......这是一个通配文件的问题,但不是因为我的 shell 明确禁用了它,或相对路径。
我正在启动“shell 脚本”和 shell 命令,但在 bash/sh/tcsh 等上下文之外。直接执行 cp 只会出现问题。
执行中
/bin/bash -c "cp /blah/* /someotherdir/"
工作得非常好。感谢线索!
答案3
你的脚本中有一个错误。我们不知道在哪里,因为你还没有展示你的脚本。
鉴于您的有限描述,即使以相同权限运行的命令可以遍历目录,外壳程序似乎也没有扩展/tmp/mnt221234jk/*
到文件列表。因此,一个可能的解释是您在某个时候cp
关闭了set -f
或 的通配符。set -o noglob
用 重新打开set +f
。