Shell中的“ quote”命令


15

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


它只是添加了引号
Hakeem Wahab

1
随便看看,我发现了一个名为shell-quote的实用程序,它与quote相似,但是对ssh和调试bash脚本有一些用途。以为我会在这里将其作为脚注。' linux.die.net/man/1/shell-quote '

感觉像WTF一样具有通用词,quote用于如此晦涩的目的...没有前缀将其标记为“内部”,没有文档,也没有任何内容,除非您深入研究发行版的高级完成机制的实现细节。我觉得这有点令人不安。
海德2014年

对于母语不是英语的人来说,这变得更加晦涩难懂。像我一样。:)
whtyger,2014年

Answers:


10

它是什么?

我注意到该命令在我的shell(fish,友好的交互式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"
}

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

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

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


2
which在交互式shell和脚本中都是没有用的。使用type代替。type quote会告诉您这是一个函数,甚至显示函数定义。help typetype内置模块上运行更多。
盖尔哈

您说得对,谢谢。我在上面看到了答案,该答案还使用了类型来找出它是什么。好吧,多亏了“哪个”,我知道它不是/ bin /中的可执行文件,因为它没有返回任何路径。我认为它仍然很有用。但是您是对的,我将添加类型。
2013年

2
在我的Ubuntu 12.04中/etc/bash_completion,真正在中描述了此功能~/.bashrc,默认情况下提供该功能,而不是/etc/bash.bashrc有关/etc/bash_completion部分的注释处。另外/usr/share/bash-completion/的文件夹是在Ubuntu 12.04缺席。
Whtyger,2013年

8

quote是在file中定义的函数(在我的Debian系统上,但是我想在Ubuntu上是相同的),该文件/usr/share/bash-completion/bash_completion本身是/etc/bash.bashrc在Bash启动时提供的。

我永远不会使用此功能!如果您需要引用的东西,所以作为一个壳可以安全使用,请使用printf%q改性剂,如:

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

实际上,即使很少使用这种方法,对于高水平的东西,总是有更好的策略,就像我们用户一样。quote我们甚至不想在一些晦涩的东西内部使用此东西。该quote功能可能是特定于供应商/发行版的(特定于Debian),并且可能根本无法移植,甚至在将来的发行版中可能会发生变化。

编辑。我刚刚在Ubuntu 12.04系统上进行了检查,该quote函数在中定义/etc/bash_completion,由来源/etc/bash.bashrc,其本身由来源/etc/profile

我如何确定呢?使用一些启发式:

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

    grep '\bquote\b' /etc/profile

    否。转到下一步。

  • 什么是文件源/etc/profile

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    我有$i(需要考虑的来源这是什么来源,但在这种情况下,它的文件,/etc/profile.d/*.sh如果有的话(如果读取)和/etc/bash.bashrc。展望/etc/bash.bashrc

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

quote确实会转义单引号,因此可以被外壳使用。它与printf %q该用例一样工作。
Flimm

@Flimm使用后果自负!
gniourf_gniourf 2013年

@gniourf_gniourf我认为printf%q无法正确处理波浪号()。试试这个:my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")"。你会看到类似Expected: ~/.bashrcquote: ~/.bashrcprintf %q: /home/your_username/.bashrc
Rockallite

1
@Rockallite:我刚试过了,效果很好...
gniourf_gniourf

如果您想直接跳到源,你可以使用(shopt -s extdebug; declare -F quote),它告诉你它是在定义函数名,行号和文件名是在定义。
wjandrea

3

quote 是一个功能:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

该函数在bash初始化文件中的某个位置定义。更准确地说,如果您使用的是Ubuntu 13.04,则可以在/usr/share/bash-completion/bash_completion142行找到它。

使用以下命令进行检查:

type quote

其目的很明显。


它的作用很明显-但是您可能不想这样做。为避免疑问:它将用于获取诸如的变量$INPUT,该变量可能包含空格,引号或其他字符,并返回一个字符串,该字符串肯定仅被bash视为单个参数。
本XO
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.