首先,我将描述问题。我经常将文件从我的 linux 桌面复制到我的 android 平板电脑。出于我不想进入的原因,我发现最简单的方法是在我的平板电脑上运行 sshDroid(一个 ssh 服务器),并使用scp
shell 复制文件。该scp
命令采用以下形式:
scp -P 2222 ./some\ document\:\ with\ subtitle\ -\ author.txt \
root@197.157.0.211:/sdcard/uploads
这个表达式中唯一改变的是文件名,这很容易通过制表符完成来实现。甚至IP地址都没有改变。由于我经常上传文件,我非常希望不要一遍又一遍地输入相同的字符。为此,我想我会编写一个 shell 函数并将其附加到.bashrc
. 我写的函数如下:
upload(){ scp -P 2222 $@ root@192.168.0.151:/sdcard/uploads; }
它的用法应该是:
upload ./some\ document\:\ with\ subtitle\ -\ author.txt
但是当我尝试它时,我得到以下输出:
SSHDroid
Use 'root' as username
Default password is 'admin'
root@192.168.0.151's password:
./some: No such file or directory
ssh: Could not resolve hostname document: Name or service not known
with: No such file or directory
subtitle: No such file or directory
-: No such file or directory
author.txt: No such file or directory
看起来 bash 在将文件名传递给函数之前会自动对文件名进行转义,并且 scp 命令由于名称中的空格而将其视为多个文件名。
我的问题是:如何保留参数中的反斜杠,或者如果失败,我如何在函数中重新转义它?在摆弄了一段时间之后,我非常想编写一个简单的 python 脚本并将其放入 /usr/local/bin。我还缺少其他一些 bash-native 解决方案吗?