我有一个脚本,其中 scp 是从远程主机返回本地的文件。有时文件名包含空格。 scp 不喜欢其文件名中包含空格。由于某种原因,我处理空格的尝试并未产生正确的 scp 路径。
代码:
PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg
scp $PATH [email protected]:/Users/Me/Desktop
结果是
Cannot find directory: var/root/Documents/MyFile
Cannot find directory: OG-v1.2.3.pkg
将 PATH 括在引号中"$PATH"
会产生相同的错误。
将空格交换为转义空格也不起作用,尽管据我所知它应该:
ESC_PATH=${PATH/' '/'\ '}
尽管打印转义路径表明编辑有效:
echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
答案1
您应该引用声明和用法
path="/var/root/Documents/MyFile OG-v1.2.3.pkg"
scp "$path" [email protected]:/Users/Me/Desktop
如果您不引用第一部分,$path
则将仅包含第一部分。如果您不引用第二个,scp
则会将每个空格分隔的部分视为参数。
(我已更改$PATH
为,$path
因为$PATH
是一个重要的保留变量,您不得将其用于一般目的。)
答案2
我正在尝试与 ssh 非常相似的方法并通过它传递命令行。例如
ssh <somehost> ls -l "$PATH"
我发现简单地定义“$PATH”并没有起到作用——它仍然会抛出错误。但是如果我运行
ssh <somehost> ls -l "\"$PATH"\"
这有效。诀窍是确保将一组附加的“”从 shell 传递到 ssh 命令。