首先,我将描述问题。我经常将文件从我的linux桌面复制到我的Android平板电脑。由于我不想进入的原因,我发现这样做的最简单方法是在我的平板电脑上运行sshDroid(一个ssh服务器),并使用shell中的scp
来复制文件。 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解决方案?
答案 0 :(得分:2)
行情!
未加引号,$@
的行为与$*
完全相同;如果要保留原始标记化,则需要使用"$@"
。因此:
upload() { scp -P 2222 "$@" root@192.168.0.151:/sdcard/uploads; }