尝试 cp 包含空格的路径,在编写脚本时失败,但回显和粘贴成功?

尝试 cp 包含空格的路径,在编写脚本时失败,但回显和粘贴成功?

我有一个脚本尝试将目录从包含反斜杠转义空格的路径复制到存储在字符串变量中的工作目录的子目录中。

当我运行脚本时,我得到了以下用法cp

usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory

但是,如果我回显该命令,它看起来完全正确。即使我随后将回显的行复制并粘贴回终端,它也能正常执行!

rm -rf Payload
mkdir Payload
echo cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app
cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app

我不明白为什么它不能在 Bash 中正确执行,但手动粘贴命令却可以完美地工作。此外,我什至无法说出问题是什么,因为当我手动执行此操作时它工作正常(但我显然怀疑空格)。cp如果有帮助的话,退出代码是 64。

$APP_PROTOTYPE看起来像.golden_repo/Production\ Releases\ Only/Kiosk/1.0.3/Prototype/Kiosk.app,请注意这.golden_repo是一个已安装的 smbfs 共享。

答案1

您需要引用命令中包含空格的部分,以防止单词拆分使它们成为两个不同的参数:

cp -Rf "$APP_PROTOTYPE/" "Payload/${BUNDLE_NAME}.app"

应该做你想做的事。请注意,您需要双引号而不是单引号,以允许在引号内进行变量插值。

的输出echo并不意味着该命令应该正常工作。与处理路径名不同的是cpecho由于分词,一个参数变成多个参数是完全可以的:

echo 'a b'

echo a b

两者应该产生相同的结果。

相关内容