bash:获取以给定string开头的命令列表

是否有可能使用Bash,从一个特定的string开始的命令列表?
input命令开始后,我想要打印两次<tab>,然后将其存储在一个variables中。

Solutions Collecting From Web of "bash:获取以给定string开头的命令列表"

您应该能够使用compgen命令,如下所示:

compgen -A builtin [YOUR STRING HERE] 

例如,“compgen -A内建l”返回

 let local logout 

您可以使用其他关键字代替“内置”来获得其他类型的完成。 内建给你壳内置的命令。 “文件”给你本地文件名等

下面是一个操作列表(从BASH手册页中可以看出 完成哪个compgen ):

  alias Alias names. May also be specified as -a. arrayvar Array variable names. binding Readline key binding names. builtin Names of shell builtin commands. May also be specified as -b. command Command names. May also be specified as -c. directory Directory names. May also be specified as -d. disabled Names of disabled shell builtins. enabled Names of enabled shell builtins. export Names of exported shell variables. May also be specified as -e. file File names. May also be specified as -f. function Names of shell functions. group Group names. May also be specified as -g. helptopic Help topics as accepted by the help builtin. hostname Hostnames, as taken from the file specified by the HOSTFILE shell variable. job Job names, if job control is active. May also be specified as -j. keyword Shell reserved words. May also be specified as -k. running Names of running jobs, if job control is active. service Service names. May also be specified as -s. setopt Valid arguments for the -o option to the set builtin. shopt Shell option names as accepted by the shopt builtin. signal Signal names. stopped Names of stopped jobs, if job control is active. user User names. May also be specified as -u. variable Names of all shell variables. May also be specified as -v. 

一个有趣的方法是打M-* (元通常是左Alt)。

作为一个例子,输入这个:

 $ lo 

然后打M-*

 $ loadkeys loadunimap local locale localedef locale-gen locate lockfile-create lockfile-remove lockfile-touch logd logger login logname logout logprof logrotate logsave look lorder losetup 

你可以阅读更多关于这个在man 3 readline ; 这是readline库的一个特点。

如果你想要完全如何bash

 COMPLETIONS=$(compgen -c "$WORD") 

compgen使用tab选项时使用的相同规则完成。

JacobM的回答很好。 为了做手工,我会使用这样的东西:

 echo $PATH | tr : '\n' | while read p; do for i in $p/mod*; do [[ -x "$i" && -f "$i" ]] && echo $i done done 

输出前的测试确保只显示可执行的常规文件。 以上显示了所有以mod开头的命令。

有趣的是,我不知道compgen 。 这里有一个我用来做它的脚本,它不检查不可执行文件:

 #!/bin/bash echo $PATH | tr ':' '\0' | xargs -0 ls | grep "$@" | sort 

将这个脚本保存在你的$PATH (我命名为findcmd ), chmod u+w it,然后像grep一样使用它,传递你喜欢的选项和模式:

 findcmd ^foo # finds all commands beginning with foo findcmd -i -E 'ba+r' # finds all commands matching the pattern 'ba+r', case insensitively 

迭代$ PATH变量,并为路径中的每个目录做ls beginningofword*

为了得到完全相同的结果,你只需要过滤掉可执行文件并按名称排序(使用ls标志和sort命令应该很容易)。

当您点击时列出的是PATH中以该字符串开头的二进制文件。 因此,如果PATH变量包含:PATH = / usr / local / bin:/ usr / bin:/ bin:/ usr / games:/ usr / lib / java / bin:/ usr / lib / java / jre / bin: / usr / lib目录/ QT /斌:在/ usr /共享/ TEXMF /斌:。

Bash会查看每个目录,一旦你点击,就会向你显示这些建议。 因此,要获得以“ls”开头的命令列表,你可以这样做:MYVAR = $(ls / usr / local / bin / ls * / usr / bin / ls * / bin / ls *)当然你可以添加我没有的所有其他目录。

只是为了好玩,另一个手动变体:

 find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f -perm -001 -print 

pattern指定您要使用的文件名称模式。 这将会丢失那些不是全局可执行的,但是你有权限的命令。

[在Mac OS X上测试]


使用-or-and标志来构建此命令的更全面的版本:

 find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f \( \ -perm -001 -or \ \( -perm -100 -and -user $(whoami)\) \ \) -print 

将通过拥有它们来获取您获得许可的文件。 我没有看到一个通用的方法来获得所有可以凭借团队联系而执行的,而没有更多的编码。