是否可以使用Bash获取以某个字符串开头的命令列表?
我想得到打印的内容< tab>键入命令的开头后两次,例如,将其存储在变量中。
答案 0 :(得分:33)
您应该能够使用 compgen 命令,如下所示:
compgen -A builtin [YOUR STRING HERE]
例如,“compgen -A builtin l”返回
let
local
logout
您可以使用其他关键字代替“builtin”来获得其他类型的完成。 Builtin为您提供shell内置命令。 “文件”为您提供本地文件名等。
以下是一系列操作(来自使用 compgen 的完整的BASH手册页):
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.
答案 1 :(得分:2)
有趣的方法是点击M-*
(Meta通常是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
库的一个功能。
答案 2 :(得分:1)
如果你想要bash完全如何完成
COMPLETIONS=$(compgen -c "$WORD")
compgen完成时使用bash在标签时使用的相同规则。
答案 3 :(得分:1)
JacobM的答案很棒。为了手动完成,我会使用这样的东西:
echo $PATH | tr : '\n' |
while read p; do
for i in $p/mod*; do
[[ -x "$i" && -f "$i" ]] && echo $i
done
done
输出前的测试确保只显示可执行的常规文件。以上显示了以mod
开头的所有命令。
答案 4 :(得分:1)
有趣的是,我不知道compgen
。这是我用来做的一个脚本,它不检查非可执行文件:
#!/bin/bash
echo $PATH | tr ':' '\0' | xargs -0 ls | grep "$@" | sort
将该脚本保存在$PATH
(我将其命名为findcmd
),chmod u+w
中的某个位置,然后像grep
一样使用它,传递您喜欢的选项和模式:
findcmd ^foo # finds all commands beginning with foo
findcmd -i -E 'ba+r' # finds all commands matching the pattern 'ba+r', case insensitively
答案 5 :(得分:0)
迭代$ PATH变量并为路径中的每个目录执行ls beginningofword*
?
为了使它完全等效,你需要只过滤掉可执行文件并按名称排序(使用ls标志和sort命令应该很容易)。
答案 6 :(得分:0)
点击时列出的是PATH中以该字符串开头的二进制文件。因此,如果您的PATH变量包含: PATH =在/ usr / local / bin目录:在/ usr / bin中:/ bin中:在/ usr /游戏:/ usr / lib中/ JAVA /斌:/ usr / lib中/ JAVA / JRE / bin中:/ usr / lib中/ QT /箱:在/ usr /共享/ TEXMF / bin中:
Bash会查看每个目录,以便在您点击后向您显示建议。因此,要将以“ls”开头的命令列表放入变量中,您可以执行以下操作: MYVAR = $(ls / usr / local / bin / ls * / usr / bin / ls * / bin / ls *) 当然,你可以添加我没有的所有其他目录。
答案 7 :(得分:0)
只是为了好玩,另一种手动变体:
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
将通过拥有它们来获取您已获得许可的文件。我没有看到一种通用的方法来获得所有那些你可以通过群组联盟执行而无需更多编码的人。