从一个目录复制文件到另一个目录的Shell脚本

4

尝试编写一个简单的脚本来在OS X 10.9中复制一些文件。

以下是内容:

SRC_DIR="~/Library/Preferences-Old"

DST_DIR="~/Library/Preferences"

FILEN="test.txt"

cp $SRC_DIR/$FILEN $DST_DIR

给我输出:
cp: ~/Library/Preferences-Old/test.txt: No such file or directory

当然,上述方法是错误的。在终端中直接使用相同的cp命令即可完成操作。我在这里做错了什么?

实际上,删除所有引号解决了问题!不确定这里到底发生了什么... - apil.tamang
重点在于理解引用。例如阅读bash引用 - Fredrik Pihl
@apil.tamang shellcheck 有助于指出问题,表示“请注意,在引号中不会扩展 ~。”。 - that other guy
3个回答

8

~ 是 “当有疑问时,请加引号” 规则的少数例外之一。正如其他人指出的那样,带引号的 ~ 不会扩展。但是,您仍然可以引用字符串的其余部分:

SRC_DIR=~"/Library/Preferences-Old"
DST_DIR=~"/Library/Preferences"

请注意,根据分配给两个*_DIR变量的值,仅引用被分配的值是不够的;您仍然需要引用它们的扩展。
FILEN="test.txt"

cp "$SRC_DIR/$FILEN" "$DST_DIR"

6

你的双引号阻止了shell将~转换为一个实际的路径。请注意:

$ echo ~
/home/politank_z

$ echo "~"
~

~ 不是一个实际的位置,它是指代您的主目录路径的简写。


2

如已提到,双引号禁用了~扩展。

更好的方法是使用HOME变量:

SRC_DIR="$HOME/Library/Preferences-Old"
DST_DIR="$HOME/Library/Preferences"

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