如何避免Bash波浪号(~)展开,实现SCP函数远程路径原样传递
解决Bash函数中SCP命令的波浪号展开问题
我明白你想简化远程文件拷贝的需求,不过问题的根源其实不在函数内部的字符串拼接,而是Bash的参数展开时机——当你输入scpcloud ~/myfileonremote.png myfileonlocal.png时,本地Bash会在调用函数之前就把~展开成你本地的用户目录(比如/Users/kenny/myfileonremote.png),所以函数里的$1拿到的已经是展开后的路径,这就是为什么你之前加引号拼接也没用的原因。
下面给你两个可行的解决方案:
方案1:输入参数时用单引号包裹(简单直接)
要让~不被本地Bash展开,只需要在输入远程路径时用单引号括起来,这样函数就能拿到原始的带~的路径:
scpcloud '~/myfileonremote.png' myfileonlocal.png
同时你可以把函数简化成更简洁的版本,不需要拼接字符串:
scpcloud() { scp "$(whoami)@${REMOTE_HOST}:$1" "$2" }
这样SCP会把kenny@remote.host.com:~/myfileonremote.png传递给远程主机,远程的Shell会自动把~展开为远程用户的Home目录,完全符合你的预期。
方案2:用交互式输入避免参数提前展开(无需手动加引号)
如果你不想每次输入都加引号,可以改成交互式的函数,用read直接获取原始输入(不会触发Bash的参数展开):
scpcloud() { read -p "请输入远程文件路径(例如:~/myfile.png):" remote_path read -p "请输入本地保存路径:" local_path scp "$(whoami)@${REMOTE_HOST}:$remote_path" "$local_path" }
调用时直接输入scpcloud,然后按照提示输入路径即可,输入的~会原样传给远程主机。
需要注意的是,方案1是更符合Bash常规使用习惯的方式,也更适合脚本化调用;方案2则更适合手动交互场景。
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

