【问题标题】:Calling a Bash function with an argument that has an ampersand in it调用带有与号的参数的 Bash 函数
【发布时间】:2017-10-07 17:43:29
【问题描述】:

我想要一个 bash 函数来转换它……

download HELLO&P=1&Q=2

进入这个……

aria2c -d ~/Downloads "HELLO&P=1&Q=2"

HELLO&P=1&Q=2 是一个 MAGNET 链接。如果它周围没有双引号,则 aria2c 不起作用。但我似乎无法将这一切保持在一起。问题似乎是 MAGNET 链接末尾有一系列 &key=value 对(在我的示例中为 &P=1&Q=2),这些似乎被剥离并与链接的其余部分分开(即 HELLO)。

这是我的.bash_profile 函数。

download() {
  aria2c -d ~/Downloads "$1"
}

这是一个示例输出。

~ $ download HELLO&P=1&Q=2
[1] 7389
[2] 7390
aria2c -d /Users/lukejanicke/Downloads HELLO
[1]-  Done                    download HELLO
[2]+  Done                    P=1
~ $ 

甚至不确定Q=2 去了哪里。使用真正的 MAGNET 链接,所有部件都以这种枚举方式显示。

我需要某种方法将整个 MAGNET 链接捕获为单个参数,然后执行 aria2c 命令并在链接周围加上引号。

【问题讨论】:

  • Re: "Q=2 去哪里" -- 它被执行(在前台,而P=1 发生在后台的子shell 中,然后在完成那一行/三行后退出-字符命令)。如果你在同一个 shell 中运行echo "$Q",输出将是2。

标签: bash aria2


【解决方案1】:

双引号使 bash 解释内部字符串。

我已经测试过了:

$ download() {   aria2c -d ~/Downloads "$1"; }
victor 0 12:48 /Users/victor/tmp

$ download "http://localhost:8080/HELLO&P=1&Q=2"

10/07 12:48:56 [NOTICE] Downloading 1 item(s)

10/07 12:48:56 [ERROR] CUID#7 - Download aborted. 
URI=http://localhost:8080/HELLO&P=1&Q=2E

【讨论】:

  • 是的,请注意,当您调用下载时,您还可以使用单引号。这能解决你的问题吗?
  • @lukejanicke,如果您没有将它们放在用户输入中的链接周围,shell 怎么知道用户没有要求它在后台运行 download HELLO,以及单独的在后台命令P=1,在前台单独命令P=2?
  • 所以你是说没有办法?这就是 bash 的工作原理?我可以忍受这一点。我只是在学习。
  • 您通常无法将 url 复制粘贴到 shell 提示符中而不使其成为有效的 shell 命令,但是您绝对可以编写一个命令来获取一个完整的 URL 文件或提示您粘贴一个 URL无需引号。
  • @lukejanicke 是的,这就是 bash 的工作原理。不只是 bash,任何符合 POSIX shell 语法规则的 shell。在任何 POSIX shell 中,如果命令行包含的 & 既不是转义也不是在引号内(或像 >& 这样的复合句法元素的一部分),它将被解析为命令之间的分隔符,而不是命令或其参数的一部分。
【解决方案2】:

& 是 shell 中的一个特殊字符。您需要引用包含它的字符串:

download 'HELLO&P=1&Q=2'

否则,它被理解为在后台运行左侧的命令分隔符。

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2018-10-12
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多