我有一个脚本试图从包含反斜杠转义空格并存储在字符串变量中的路径复制目录到工作目录的子目录。
当我运行脚本时,我得到了以下用法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
Run Code Online (Sandbox Code Playgroud)
但是,如果我回显该命令,它看起来完全正确。即使我随后将该回显行复制并粘贴回终端,它也能正常执行!
rm -rf Payload
mkdir Payload
echo cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app
cp -Rf $APP_PROTOTYPE/ Payload/${BUNDLE_NAME}.app
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它不能在 Bash 中正确执行,但手动将命令粘贴回工作中可以完美无缺。此外,我什至无法说出问题是什么,因为当我手动执行时它可以正常工作(但是我显然怀疑空格)。退出代码cp
是 64,如果这有帮助的话。
$APP_PROTOTYPE
看起来像.golden_repo/Production\ Releases\ Only/Kiosk/1.0.3/Prototype/Kiosk.app
,并注意这.golden_repo
是一个已安装的 smbfs 共享。
您需要引用包含空格的命令部分,以防止单词拆分使它们成为两个不同的参数:
cp -Rf "$APP_PROTOTYPE/" "Payload/${BUNDLE_NAME}.app"
Run Code Online (Sandbox Code Playgroud)
应该做你想做的。请注意,您需要双引号而不是单引号以允许在引号内进行变量插值。
的输出echo
并不意味着该命令应该正常工作。与cp
处理路径名的不同,echo
由于分词,一个参数变成了几个参数是完全没问题的:
echo 'a b'
Run Code Online (Sandbox Code Playgroud)
和
echo a b
Run Code Online (Sandbox Code Playgroud)
应该都产生相同的结果。