我有这个 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:
"/home/lv2eof/.config/google-chrome/Profile
1/Bookmarks"
"/home/Config/Browser/Bookmarks/ScriptSaved/Chrome/Profile
1/20211207-001444-Bookmarks"
换句话说,将 1、2 和 3 复制到 4 中。