【问题标题】:Escaping parameter to bash function [duplicate]将参数转义到bash函数[重复]
【发布时间】:2016-10-22 11:16:54
【问题描述】:

首先我将描述问题。我经常将文件从我的 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 原生解决方案吗?

【问题讨论】:

  • 问题不是“转义”,而是字符串拆分。取消转义总是在解析过程的早期发生,但它应该是——这是一个特性,而不是一个错误。问题是,当您的未转义内容随后由于未正确引用而被字符串拆分或 glob 扩展时。见mywiki.wooledge.org/BashParser
  • 顺便说一句,如果您的目标是对执行模型有一个很好的理解 [而 BashParser 页面仍然让您缺乏信心],BashFAQ #50 触及了一些误解的相同主题这个问题的背后;见mywiki.wooledge.org/BashFAQ/050

标签: bash escaping scp bash-function


【解决方案1】:

行情!

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

upload() { scp -P 2222 "$@" root@192.168.0.151:/sdcard/uploads; }

【讨论】:

  • 有效!感谢您的回答和深入的链接。
猜你喜欢
  • 2020-04-01
  • 2012-09-02
  • 2016-10-18
  • 2012-06-12
  • 2018-09-14
  • 2010-11-21
  • 2014-01-10
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多