从代码启动 cp 导致无法 stat '/tmp/somedir' 在 shell 中工作

从代码启动 cp 导致无法 stat '/tmp/somedir' 在 shell 中工作

我正在努力通过在真正的 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

相关内容