在我的 Linux 机器中,我可以找到以ls
by开头的命令
$ ls<TAB-key>
我得到这样的结果
ls lsb_release lscpu lshw lsipc lslogins lsmod lsof lspcmcia lss16toppm
lsattr lsblk lsdiff lsinitramfs lslocks lsmem lsns lspci lspgpot lsusb
现在lsmod
,我想知道还有哪些命令存在。
据$ man lsmod
我了解还有其他命令,例如,
SEE ALSO
insmod(8), modprobe(8), modinfo(8) depmod(8)
但是从终端我找不到mod string
使用的命令外卡。请指导,如何在任何情况下完成Unix 和 Linux发行版
答案1
一些 shell 对此有内置支持。
桀骜
许多zsh
shell 的自省内置命令都采用-m
参数来进行模式m
匹配。这是(从 ksh 复制和扩展)的情况,whence
用于识别为方便其他 shell 用户而提供的命令和变体(与 csh 用户which
相同, (标准)与 SysV shell 用户相同)以及用于操作内部哈希的标准内置命令表,包括命令路径的表。whence -c
type
whence -v
hash
whence -m '*mod*'
type -m '*mod*'
which -m '*mod*'
hash -m '*mod*'
前 3 个还查看内置函数、函数、关键字、别名;添加-p
对命令的限制,$PATH
如 for hash
。
或者您可以使用以下命令手动查找匹配的可执行文件$PATH
(映射到$path
数组):
print -rC1 -- $^path/*mod*(DN-*)
除了一些内置命令之外,为了自省(并帮助完成),zsh 还在一些特殊变量中公开了一些内部状态和缓存数据。例如,命令的哈希表及其路径公开在$commands
特殊的关联数组中,因此您可以使用以下命令查看其键:
print -rC1 -- ${(kM)commands:#*mod*}
模式匹配是使用${(M)array:#pattern}
运算符完成的。
在那里,您还可以将完成系统配置为除了正常完成之外还尝试通配符匹配。例如,至少:
zstyle ':completion:*' completer _complete _match
autoload -Uz compinit
compinit
在您的 中~/.zshrc
,输入
$ *mod*<Tab>
将向您显示与该模式匹配的可能命令的列表。尽管:
$ man -s1,8 *mod*<Tab>
Completing manual page
check-module mk_modmap
chmod modinfo
combine_lang_model modprobe
depmod perlmod
dh_gtkmodules perlmodinstall
[...]
将向您显示手册第 1 部分(用户命令)和第 8 部分(系统管理命令)中包含mod
.
zsh
第一次启动时,您应该会看到一个newuser
菜单来调整所有这些。以上内容可以在:
(1) Continue to the main menu.
[...]
(2) Configure the new completion system. (Recommended.)
[...]
(2) Run the configuration tool (compinstall)
[...]
1. Completers: choose completion behaviour for tasks such as
approximation, spell-checking, expansion.
[...]
m. Set completers that modify the behaviour of the four main ones above.
[...]
1. _ignored: Use patterns that were previously ignored if no matches so far.
2. _list: Only list matches until the second time you hit TAB.
3. _oldlist: Keep matches generated by special completion functions.
4. (*) _match: If completion fails, retry with pattern matching.
5. _prefix: If completion fails, retry ignoring the part after the cursor.
并选择上面的4。但我强烈建议您浏览所有菜单,因为那里还有更多好吃的东西。
巴什
在bash
shell 中,您可以使用:
compgen -cX '!*mod*'
与...一样:
compgen -A command -X '!*mod*'
compgen -c
/compgen -A command
给出已知命令的列表(包括关键字、别名、内置命令和函数),-X
目的是排除那些与某个模式匹配的命令,但以 开头的该模式!
将从排除更改为包含。
rc 和导数
在 中rc
,$path
列表与环境变量相关联,$PATH
如 csh 或 zsh 中,
ls -d -- $path/*mod* >[2] /dev/null
请注意,它rc
没有相当于zsh
sD
或-*
glob 限定符,因此该列表不限于可执行文件,也不包含隐藏文件。
rc
与 Bourne shell 及其大多数衍生产品共享一个错误功能,即不匹配的 glob 模式保持原样,因此如果给定目录中没有匹配项,我们将得到一个文字/that/dir/*mod*
.我们通过传递列表来解决这个问题,该列表抱怨名称中ls
包含那些不存在的文件,但使用(与类似 Bourne 的 shell 或相同)丢弃这些错误*
>[2] /dev/null
2> /dev/null
fish
鱼
与 类似rc
,对于不可执行具有相同的警告,但通过{.,}
在模式中添加前缀来添加隐藏文件支持:
printf '%s\n' $PATH/{,.}*mod*
POSIX sh
在 POSIX sh 中,您可以定义一个函数,例如:
find_commands() (
pattern=$1
IFS=:; set -o noglob
set -- $PATH''
IFS=; set +o noglob
for dir do
for file in "${dir:+$dir/}"$pattern "${dir:+$dir/}".$pattern; do
if [ -f "$file" ] && [ -x "$file" ]; then
printf '%s\n' "$file"
fi
done
done
)
用作:
find_command '*mod*'
1 请注意,如果存在空$PATH
组件,则它无法正常工作,就像PATH=/bin/:/usr/bin:
最后一个空组件意味着在当前工作目录中查找一样。可以通过使用${^path/#%/.}
替换那些空字符串来解决这个问题.
,但无论如何,从安全性和可靠性的角度来看,使用空$PATH
组件(或$PATH
通常是相对路径的组件)是非常糟糕的做法,不应该这样做。这同样适用于下面给出的手动查找$PATH
/$path
目录的其他 shell 的解决方案。
答案2
# in at least bash
start cmd:> ( IFS=: ; find $PATH -type f -name 'ls*' -perm /111 -ls )
96723 4 lrwxrwxrwx 1 root root 4 Mär 19 23:08 /usr/bin/lsmod -> kmod
281915 4 lrwxrwxrwx 1 root root 11 Mär 19 22:35 /usr/bin/lsb-release -> lsb_release
733984 4 -rwxr-xr-x 1 root root 2479 Mär 20 05:53 /usr/bin/lss16toppm
734097 4 -rwxr-xr-x 1 root root 1821 Mär 19 22:36 /usr/bin/lsdev
955869 12 -rwxr-xr-x 1 root root 10514 Mär 19 22:35 /usr/bin/lsb_release
1070923 16 -rwxr-xr-x 1 root root 14215 Mär 20 00:13 /usr/bin/lsusb.py
1245610 136 -rwxr-xr-x 1 root root 138016 Apr 1 19:45 /usr/bin/ls
1254310 104 -rwxr-xr-x 1 root root 104632 Apr 1 21:16 /usr/bin/lscpu
1254311 76 -rwxr-xr-x 1 root root 73928 Apr 1 21:16 /usr/bin/lsfd
1254312 52 -rwxr-xr-x 1 root root 51384 Apr 1 21:16 /usr/bin/lsipc
1254313 28 -rwxr-xr-x 1 root root 26808 Apr 1 21:16 /usr/bin/lsirq
1254314 32 -rwxr-xr-x 1 root root 31304 Apr 1 21:16 /usr/bin/lslocks
1254315 40 -rwxr-xr-x 1 root root 39096 Apr 1 21:16 /usr/bin/lsmem
1254316 40 -rwxr-xr-x 1 root root 39096 Apr 1 21:16 /usr/bin/lsns
1254878 136 -rwxr-xr-x 1 root root 137400 Apr 1 21:22 /usr/bin/lsblk
1254879 52 -rwxr-xr-x 1 root root 51384 Apr 1 21:22 /usr/bin/lslogins
1255279 84 -rwxr-xr-x 1 root root 85136 Mär 19 22:34 /usr/bin/lsscsi
1255280 176 -rwxr-xr-x 1 root root 179912 Mär 19 22:50 /usr/bin/lsof
1258862 2980 -rwxr-xr-x 1 root root 3048800 Mär 20 06:13 /usr/bin/lsar
1264433 16 -rwxr-xr-x 1 root root 14456 Mär 19 22:35 /usr/bin/lsattr
1264457 12 -rwxr-xr-x 1 root root 11989 Mär 20 04:18 /usr/bin/lsinitrd
1271261 104 -rwxr-xr-x 1 root root 106376 Mär 19 23:14 /usr/bin/lspci
1272752 252 -rwxr-xr-x 1 root root 256328 Mär 20 00:13 /usr/bin/lsusb
答案3
要搜索手册页,您可以使用(与许多实现apropos
相同),它对所有手册页及其摘要的索引进行一些正则表达式匹配。man -k
man
使用apropos
from mandb
(常见于基于 Linux 的系统),
apropos mod
将返回名称或摘要与正则表达式匹配的手册页条目mod
(请注意,这与 shell glob 通配符模式不同),即它包含mod
.
您还可以指定要查看的部分或部分列表。
要仅在名称而不是摘要中查找mod
,您可以利用以下事实:页面名称几乎不包含空格,而摘要几乎总是包含空格。
所以:
apropos -s1,8 '^[^ ]*mod[^ ]*$'
应返回第 1 节和第 8 节中的手册页,其姓名包含mod
,因为正则表达式匹配主语 ( ) 的开头,后跟除空格 ( )之外^
的任意数量 ( ) 的字符,后跟除空格 ( ) 之外的任意数量 ( ) 的字符,后跟主题的结尾主题 ( ),所以简而言之,它周围没有任何空格。*
[^ ]
mod
*
[^ ]
$
mod