B 脚本中的 Linux“cp”命令

B 脚本中的 Linux“cp”命令

我有这个 bash 脚本:

#!/bin/bash

OriginFilePath="/home/lv2eof/.config/google-chrome/Profile 1/"
OriginFileName="Bookmarks"
OriginFilePathAndName="$OriginFilePath""$OriginFileName"

DestinationFilePath="/home/Config/Browser/Bookmarks/ScriptSaved/Chrome/Profile 1/"
DestinationFileName=$(date +%Y%m%d-%H%M%S-Bookmarks)
DestinationFilePathAndName="$DestinationFilePath""$DestinationFileName"

echo cp \"$OriginFilePathAndName\" \"$DestinationFilePathAndName\"
cp \"$OriginFilePathAndName\" \"$DestinationFilePathAndName\"

当我从命令行执行它时,我得到以下输出:

[~/]
lv2eof@PERU $$$ csbp1
cp "/home/lv2eof/.config/google-chrome/Profile 1/Bookmarks" "/home/Config/Browser/Bookmarks/ScriptSaved/Chrome/Profile 1/20211207-001444-Bookmarks"
cp: target '1/20211207-001444-Bookmarks"' is not a directory

[~/]
lv2eof@PERU $$$ 

所以我收到错误并且文件未被复制。尽管如此,如果我在命令行中发出命令:

[~/]
lv2eof@PERU $$$ cp "/home/lv2eof/.config/google-chrome/Profile 1/Bookmarks" "/home/Config/Browser/Bookmarks/ScriptSaved/Chrome/Profile 1/20211207-001444-Bookmarks"

[~/]
lv2eof@PERU $$$ 

如您所见,一切正常并且文件已复制。这些命令在 bash 脚本内部和外部的工作方式不应该相同吗?我究竟做错了什么?

答案1

也许很难注意到,但消息给了你两个提示:

cp: target '1/20211207-001444-Bookmarks"' is not a directory
           |                           |
           |                           +-- Notice quote
           +-- Space in target

换句话说,1/20211207-001444-Bookmarks"它不是一个目录。那么为什么这么说呢?

在你的脚本中你有:

cp \"$OriginFilePathAndName\" \"$DestinationFilePathAndName\"

经过转义引号,你是说引号是参数的一部分。或者:将威胁引用作为文字文本。他们是串联的与变量的值。

应该:

cp "$OriginFilePathAndName" "$DestinationFilePathAndName"

简而言之:你引用变量来告诉 bash这应该作为一个参数来讨论

从你的问题来看,实际参数cp变为 4,而不是 2:

  1. "/home/lv2eof/.config/google-chrome/Profile
  2. 1/Bookmarks"
  3. "/home/Config/Browser/Bookmarks/ScriptSaved/Chrome/Profile
  4. 1/20211207-001444-Bookmarks"

换句话说,将 1、2 和 3 复制到 4 中。

相关内容