在可编程完成内置程序的完整命令中,有一个-I参数。它说:
-I选项表示其他提供的选项和操作应该应用于上的补全行的初始非赋值字,或在命令分隔符后加上。例如';'或' | ',这通常是命令名补全。
我不明白"行中最初的非赋值词",谁能举个例子。
我设置了一个完整的complete -W 'AA BB' -I
,它在命令分隔符
root@aliecs:~# complete -W 'AA BB' -I
root@aliecs:~# ls &&<tab><tab>
AA BB
root@aliecs:~# ls ;<tab><tab>
AA BB
root@aliecs:~# ls |<tab><tab>
AA BB
root@aliecs:~# ls ||<tab><tab>
AA BB
我想要一个示例">
行上的初始非赋值词">Shell命令由一系列单词组成(其中"word"有正式的意思)。赋值字是包含=
:
foo=5
这是一个单词,但在其他语言中,您可能会认为单词foo
,=
和5
只是没有空格分隔。
命令可以以0个或多个赋值字开始。赋值字不被视为要执行的命令的名称,而是作为一个变量赋值,它是"local"对那个命令。例如,
x=5 foo
是一个命令,它运行一个名为foo
的程序,在它的环境中有一个变量x
,值为5
,不是一个名为x=5
的命令,参数为foo
。
出于完成的目的,你不会真的想对赋值做完成,因为赋值的全部意义就是定义一些可能还不存在的东西,shell怎么知道如何完成你还没有定义的东西呢?因此,complete
命令忽略命令行开头的赋值词,而将重点放在第一个可能是要执行的命令名称的单词上。
示例:
root@aliecs:~# complete -W 'AA BB BC' -I
root@aliecs:~# foo=1 B<tab><tab>
BB BC
root@aliecs:~# B<tab><tab>
BB BC
"B"是"非赋值"。谢谢@chepner的回答。