shell中的“引用”命令

wht*_*ger 16 command-line bash

命令的用途是quote什么?我没有找到任何关于它的信息,它不在文件/bin夹中的可执行文件中,也无法在 Bash 内置程序中找到。它似乎只打印它的第一个参数,就像一个echo命令,仅此而已。

ver*_*ilt 12

它是什么?

我注意到这个命令在我的 shell(鱼,友好的交互式 shell)中不起作用。它似乎只适用于 bash(Ubuntu 的默认设置)。

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
Run Code Online (Sandbox Code Playgroud)

它有什么作用?它可以用来做什么?

它添加了引号但没有换行符。它还以适合 bash 的方式转义单引号。在脚本中引用变量或其他类型的字符串很有用。例如,对于带有空格的路径/参数,您需要这个。虽然还有其他方法可以做到这一点。

真的很奇怪我找不到任何关于它的文档(在网上)。但是,很容易看出它的作用。

  • `which` 在交互式 shell 和脚本中都是无用的。改用`type`。`type quote` 会告诉你这是一个函数,甚至会显示函数定义。运行 `help type` 以获取有关 `type` 内置函数的更多信息。 (3认同)
  • 在我的 Ubuntu 12.04 中,这个功能真的在 `/etc/bash_completion` 中描述,它默认来自 `~/.bashrc`,而不是来自 `/etc/bash.bashrc`,其中关于 `/etc/bash_completion` 的部分被注释掉了。在 Ubuntu 12.04 中也没有 `/usr/share/bash-completion/` 文件夹。 (2认同)

gni*_*urf 9

quote是一个在文件中定义的函数(在我的 Debian 系统上,但我猜它在 Ubuntu 上是一样的),文件/usr/share/bash-completion/bash_completion本身来自/etc/bash.bashrcBash 的启动。

我永远不会使用这个功能!如果您需要引用内容以便 shell 可以安全使用,请printf%q修饰符一起使用,如:

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""
Run Code Online (Sandbox Code Playgroud)

事实上,即使这很少使用,对于高级别的东西总是有更好的策略,就像我们用户通常做的那样。这个quote东西被一些我们甚至不想知道的晦涩的东西在内部使用。此quote功能可能是特定于供应商/发行版的(阅读 Debian 特定的)并且可能根本不可移植,甚至可能在未来版本中更改。

编辑。我刚刚检查了一个 Ubuntu 12.04 系统,该quote函数在 中定义/etc/bash_completion,来自/etc/bash.bashrc,本身来自/etc/profile.

我是如何确定这一点的?使用一点启发式:

  • 检查是否quote出现在/etc/profile

    grep '\bquote\b' /etc/profile
    
    Run Code Online (Sandbox Code Playgroud)

    否。转到下一步。

  • 文件来源是/etc/profile什么?

    grep '[[:space:]]\.[[:space:]]' /etc/profile
    
    Run Code Online (Sandbox Code Playgroud)

    我有$i(需要查看此来源的来源,但在这种情况下,它是文件(/etc/profile.d/*.sh如果有)(并且如果可读)和/etc/bash.bashrc. 在/etc/bash.bashrc.

  • quote/etc/bash.bashrc?是/否,等等...