compgen -c | sort -b | uniq | less同时显示函数和关键字(幸运的是没有别名),相反,我想要的不是关键字、函数或别名。用几句话来说,只有命令。
如果命令名与函数名、关键字名或别名匹配,则不能省略命令名。
发布于 2021-03-02 14:53:18
对于compgen (我认为是对于一般的Linux),命令就是可以运行的所有东西,包括别名和函数等等。
如果您只想在任何$PATH目录中获取可执行文件/脚本,那么使用compgen是没有好办法的。
您可以使用comm显示不包括别名、关键字和函数的所有命令:
comm -23 \
<(compgen -c | sort -u) \
<(compgen -akA function | sort -u)但是,这也将删除别名/函数和命令的命令(例如,ls或grep在Ubuntu中每个默认值都有一个别名,以及您自己添加的任何命令)。
因此,我认为最好使用自己的脚本从$PATH获取所有可执行文件(如果您希望可以使用compgen -b添加builtins ):
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)发布于 2021-03-02 13:53:37
要打印别名,请运行:
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)"将排除关键字。https://askubuntu.com/questions/1320484
复制相似问题