为什么?!cp:使用--parents,目标必须是目录

sof*_*Rat 0 directory bash parent cp

我有一个命令(有效,但脚本运行时所有内容都是从终端输出复制粘贴的):

cp --parents mcare.properties /mnt/hgfs/Shared-workspace/Release/CRMT-mcare/msite-binaries-UAT/mcare/WEB-INF/classes
Run Code Online (Sandbox Code Playgroud)

该命令由带有变量而不是文件名或目录的脚本执行,它看起来像这样(并且这个不起作用):

cp --parents $source $destination
Run Code Online (Sandbox Code Playgroud)

记录以查看每个变量中的内容:

source=mcare.properties
pwd:
/mnt/hgfs/Shared-workspace/Workspaces-CVS/Release-CRMT-mcare/mCare/config/UAT/home/wlp/mcare/WEB-INF/classes
total 16
-rwxrwxrwx. 1 root root  6724 Feb 29 19:50 activareCont.properties
drwxrwxrwx. 1 root root     0 Feb 29 20:10 CVS
-rwxrwxrwx. 1 root root  2333 Aug 25 17:55 externalpartner.properties
-rwxrwxrwx. 1 root root  1764 May 26 10:36 login.properties
-rwxrwxrwx. 1 root root 10068 Aug 25 17:55 mcare.properties
-rwxrwxrwx. 1 root root  8551 May 27 16:04 msite.properties
config/UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
medium=UAT
/mnt/hgfs/Shared-workspace/Release/CRMT-mcare/msite-binaries-UAT/mcare/WEB-INF/classes
cp: with --parents, the destination must be a directory
Try `cp --help' for more information.
Run Code Online (Sandbox Code Playgroud)

代码片段本身:

        cd $SOURCE/"${line%mcare*}"
        source="mcare.properties"
        echo source=$source
        echo "pwd:"
        pwd
        ls -l
        echo $line
        medium="${line#*config/}"
        echo $medium
        medium="${medium%/home*}"
        echo medium=${medium}""
        destination=$DEST/msite-binaries-$medium/mcare/WEB-INF/classes
        echo $destination
        cp --parents $source $destination
Run Code Online (Sandbox Code Playgroud)

我发布了一段我自己的代码,因为我只在这种情况下出现这个问题。我不知道该如何解释。

执行 bash -x scriptname 后回复 Charles Duffy。在该位置(pwd)执行同一行,如果我在终端中单独执行它,它就可以工作:

+ cd /mnt/hgfs/Shared-workspace/Workspaces-CVS/Release-CRMT-mcare/mCare/config/UAT/home/wlp/mcare/WEB-INF/classes/
+ source=mcare.properties
+ echo source=mcare.properties
source=mcare.properties
+ echo pwd:
pwd:
+ pwd
/mnt/hgfs/Shared-workspace/Workspaces-CVS/Release-CRMT-mcare/mCare/config/UAT/home/wlp/mcare/WEB-INF/classes
+ ls -l
total 16
-rwxrwxrwx. 1 root root  6724 Feb 29 19:50 activareCont.properties
drwxrwxrwx. 1 root root     0 Feb 29 20:10 CVS
-rwxrwxrwx. 1 root root  2333 Aug 25 17:55 externalpartner.properties
-rwxrwxrwx. 1 root root  1764 May 26 10:36 login.properties
-rwxrwxrwx. 1 root root 10068 Aug 25 17:55 mcare.properties
-rwxrwxrwx. 1 root root  8551 May 27 16:04 msite.properties
+ echo config/UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
config/UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
+ medium=UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
+ echo UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
+ medium=UAT
+ echo medium=UAT
medium=UAT
+ destination=/mnt/hgfs/Shared-workspace/Release/CRMT-mcare/msite-binaries-UAT/mcare/WEB-INF/classes
+ echo /mnt/hgfs/Shared-workspace/Release/CRMT-mcare/msite-binaries-UAT/mcare/WEB-INF/classes
/mnt/hgfs/Shared-workspace/Release/CRMT-mcare/msite-binaries-UAT/mcare/WEB-INF/classes
+ cp --parents mcare.properties /mnt/hgfs/Shared-workspace/Release/CRMT-mcare/msite-binaries-UAT/mcare/WEB-INF/classes
cp: with --parents, the destination must be a directory
Try `cp --help' for more information.
Run Code Online (Sandbox Code Playgroud)

我在http://www.shellcheck.net/中运行的代码片段:

cd /mnt/hgfs/Shared-workspace/Workspaces-CVS/Release-CRMT-mcare/mCare/config/UAT/home/wlp/mcare/WEB-INF/classes/ || exit
        source="mcare.properties"
        line=config/UAT/home/wlp/mcare/WEB-INF/classes/mcare.properties
        echo source=$source
        DEST=/mnt/hgfs/Shared-workspace/Release/CRMT-mcare
        echo "pwd:"
        pwd
        ls -l
        echo $line
        medium="${line#*config/}"
        echo $medium
        medium="${medium%/home*}"
        echo medium=${medium}""
        destination=$DEST/msite-binaries-$medium/mcare/WEB-INF/classes
        echo $destination
        declare -p destination
        cp  --parents $source $destination
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 5

cp --parents是一个非 POSIX 扩展,负责运行与 等效的操作mkdir -p,并且不提供您无法通过mkdir -p其自身获得的任何好处。因此,简单的答案是停止使用它:

mkdir -p -- "$destination" || exit
cp -- "$source" "$destination/"
Run Code Online (Sandbox Code Playgroud)

如果使用 GNU cp,则只有当变量为空时才能访问打印当前错误消息的代码路径target_directory。确保始终设置此值的一种方法是使用 GNU 扩展-t

[[ -d "$destination" ]] || {
  echo "$destination is not a reachable directory" >&2
  exit 1
}
cp -t "$destination" -- "$source" || exit
Run Code Online (Sandbox Code Playgroud)