该命令的用途是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_completion
142行找到它。
使用以下命令进行检查:
type quote
其目的很明显。
$INPUT
,该变量可能包含空格,引号或其他字符,并返回一个字符串,该字符串肯定仅被bash视为单个参数。