cp命令在从shell脚本中执行时无法运行

5

我有一个非常简单的shell脚本

#!/bin/bash    
cp -rf /var/www/ksite/app2/* /var/www/ksite/app
echo "----"
echo "done"

但是似乎cp命令失败了

如果我执行

cp -rf /var/www/ksite/app2/* /var/www/ksite/app

从终端操作一切正常。请问有人可以告诉我如何在Shell脚本中包含cp命令吗?

谢谢。


3
你的脚本中有任何错误吗?为什么你认为cp会失败? - rush
1
“cp命令失败”是以何种方式失败?出现了什么错误信息?很可能是$PATH问题。 - cdarke
1
@cdarke 不确定 $PATH 在这里如何涉及.. cp 肯定在路径上,不是吗? - Levon
你复制文件到的文件夹中可能存在权限问题。 - Julio Marins
我是bash脚本的新手,能问一下-rv和-rf分别代表什么吗?它们如何影响命令? - Phong Nguyen
显示剩余7条评论
5个回答

7
我们似乎对这个脚本失败的原因有些疑虑。如果没有错误消息,则这是一个奇怪的问题。建议如下:
  1. 在命令行上(可以正常工作),执行which cp
  2. 无论得到什么回复,都将其复制并将其用作脚本中的cp(例如/bin/cp
  3. 检查通配符扩展,使用bash -x script-name运行您的脚本,看看是否得到您期望的结果。
  4. 在脚本中的复制后,运行echo $? - 如果为零,则它(认为它)已正常工作。
  5. 从您的脚本中运行ls -ld /var/www/ksite/app,可能有人设置了符号链接?
  6. 如果仍然失败,请从命令行源脚本并查看是否有效. script-name
  7. 再次确认复制是否确实失败!(也许这应该是第一步。)

我尝试使用“bash -x script-name”命令并成功运行,因此我得出结论:如果从终端调用脚本,则脚本有效。之前,我正在测试从php文件调用的脚本,使用'$output = shell_exec('bash /var/www/test/b.sh'); echo $output'。为什么在从php中使用时会失败? - Kupe3
文件权限?可能是PHP以不同的用户身份运行。 - hardmath
/bin/bash、/bin/cp和我的.sh脚本都设置为0755,因此任何人都可以运行它们。 - Kupe3
1
你说bash -x script-name命令生效了?太好了!也许你的#!行有误,请参考@unwind的回答。另外,也可能是你的Bash脚本不是从PHP运行的。PHP程序有时会在奇怪的环境中运行(出于安全原因),你是否在使用受限制的shell?顺便说一句,如果最开始就提到了PHP,可能会更有帮助。 - cdarke
我找到了问题。目标文件夹缺少权限,因此cp无法创建文件/文件夹并且执行失败。从终端来看,一切都很好,因为该用户具有在目标文件夹中创建文件的权限。 - Kupe3

2

我也遇到过类似的问题,以下是帮助我的方法:

  1. 我使用Windows和putty编写脚本,因此每行末尾都有\r\n。请确保你只有\n符号。

  2. 我复制文件时,唯一可在脚本中正常工作的方法是:cp <source_dir>/fileName <dest_dir>/fileName,而在命令行中 cp <source_dir>/fileName <dest_dir> 也可以正常运行。


2

请确认您的系统真正安装了Bash,路径为/bin/bash。我建议使用更好的哈希标记:

#!/usr/bin/env bash

这里使用env命令来定位bash二进制文件并设置环境变量。


请查看我上面的评论。脚本运行正常。只是cp命令没有任何作用(不复制文件/文件夹,也不显示任何错误)。奇怪的是,如果我在终端中运行相同的命令,它就可以正常工作。我故意使用了绝对路径。 - Kupe3

1

类似于Vladmir的问题,脚本是在Windows中创建的。我在Linux环境中使用VIM创建了一个新文件“my_bash_script.sh”,然后将我的脚本内容读入该文件:

:r file_made_in_windows.sh

然后我保存、关闭,并将文件设置为可执行:

chmod 744 my_bash_script.sh

从那里,我运行了脚本:

./my_bash_script.sh

...然后它就工作了。多么奇怪的问题。我曾经困惑了一会儿。


0

只是为了确保万无一失... 权限是否在执行之间有所不同.. 例如,您是否使用sudo/root权限执行一个,而使用用户权限执行另一个(虽然不太可能,但我想问一下,因为我们不知道确切的错误是什么)


@Kupe3,我在2小时前的评论中提出了权限问题 :) - Levon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接