该命令的用途是quote什么?我还没有找到任何有关它的信息,它不在文件/bin夹的可执行文件中,而且在Bash内置文件中也找不到。似乎它只打印第一个参数,如echo命令,仅此而已。
quote用于如此晦涩的目的...没有前缀将其标记为“内部”,没有文档,也没有任何内容,除非您深入研究发行版的高级完成机制的实现细节。我觉得这有点令人不安。
该命令的用途是quote什么?我还没有找到任何有关它的信息,它不在文件/bin夹的可执行文件中,而且在Bash内置文件中也找不到。似乎它只打印第一个参数,如echo命令,仅此而已。
quote用于如此晦涩的目的...没有前缀将其标记为“内部”,没有文档,也没有任何内容,除非您深入研究发行版的高级完成机制的实现细节。我觉得这有点令人不安。
Answers:
我注意到该命令在我的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的方式转义单引号。在脚本中引用变量或其他类型的字符串可能很有用。例如,对于带空格的路径/参数,您需要使用它。尽管还有其他方法可以做到这一点。
真奇怪,我找不到有关它的任何文档(网络上)。但是,很容易看出它的作用。
which在交互式shell和脚本中都是没有用的。使用type代替。type quote会告诉您这是一个函数,甚至显示函数定义。help type在type内置模块上运行更多。
/etc/bash_completion,真正在中描述了此功能~/.bashrc,默认情况下提供该功能,而不是/etc/bash.bashrc有关/etc/bash_completion部分的注释处。另外/usr/share/bash-completion/的文件夹是在Ubuntu 12.04缺席。
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该用例一样工作。
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: ~/.bashrc,quote: ~/.bashrc和printf %q: /home/your_username/.bashrc。
(shopt -s extdebug; declare -F quote),它告诉你它是在定义函数名,行号和文件名是在定义。
quote 是一个功能:
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
该函数在bash初始化文件中的某个位置定义。更准确地说,如果您使用的是Ubuntu 13.04,则可以在/usr/share/bash-completion/bash_completion142行找到它。
使用以下命令进行检查:
type quote
其目的很明显。
$INPUT,该变量可能包含空格,引号或其他字符,并返回一个字符串,该字符串肯定仅被bash视为单个参数。