compgen -c | sort -b | uniq | less
还显示函数和关键字(幸运的是没有别名),我想要的是所有不是关键字、函数或别名的内容。简而言之,只有命令。
如果命令名与函数名、关键字名或别名匹配;则不能省略命令名。
答案1
对于compgen
(我认为对于 Linux 来说),命令是您可以运行的所有内容,包括别名和函数等。
如果您只想获取任何$PATH
目录中的可执行文件/脚本,使用 并不是一个好方法compgen
。
您可以使用comm
来显示除别名、关键字和函数之外的所有命令:
comm -23 \
<(compgen -c | sort -u) \
<(compgen -akA function | sort -u)
但是,这也会删除既是别名/功能又是命令的命令(例如,ls
在grep
Ubuntu 中默认具有别名,以及您自己添加的任何内容)。
因此,我认为您最好使用$PATH
自己的脚本获取所有可执行文件(如果您愿意,可以添加builtins
使用compgen -b
):
path_filenames(){
printf '%s' "$PATH" \
| xargs -d: -I{} -- find -L {} -maxdepth 1 -executable -type f -printf '%P\n' 2>/dev/null
}
sort -u <(path_filenames) <(compgen -b)
答案2
打印别名, 跑步:
alias
打印功能, 跑步:
declare -F
或者
declare -f
打印命令(不包括别名,关键词和功能), 跑步:
compgen -c | \
grep -wv "$(alias | grep -oP '\w+(?=\=)')"| \
grep -wv "$(declare -F | awk '{print $3}')" | \
grep -wFv "$(compgen -k)"
grep -wv "$(alias | grep -oP '\w+(?=\=)')"
将排除别名。grep -wv "$(declare -F | awk '{print $3}')"
将排除功能。grep -wFv "$(compgen -k)"
将排除关键字。