0

首先,我将描述问题。我经常将文件从我的 linux 桌面复制到我的 android 平板电脑。出于我不想进入的原因,我发现最简单的方法是在我的平板电脑上运行 sshDroid(一个 ssh 服务器),并使用scpshell 复制文件。该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 解决方案吗?

4

1 回答 1

2

引号!

未引用,$@行为与$*;相同 如果要保留原始标记化,则需要"$@"改用。因此:

upload() { scp -P 2222 "$@" root@192.168.0.151:/sdcard/uploads; }
于 2016-06-21T04:15:16.010 回答