Mario Palumbo Asked: 2021-03-03 03:50:26 +0800 CST2021-03-03 03:50:26 +0800 CST 2021-03-03 03:50:26 +0800 CST bash: compgen -c 没有返回我想要的输出 772 compgen -c | sort -b | uniq | less 还显示函数和关键字(幸运的是没有别名),我想要所有不是关键字、函数或别名的东西。简而言之,只有命令。 如果命令名与函数名、关键字名或别名匹配;命令名称不能省略。 command-line 2 个回答 Voted Best Answer pLumo 2021-03-03T06:53:18+08:002021-03-03T06:53:18+08:00 对于compgen(我认为一般是 Linux),命令是您可以运行的所有内容,包括别名和函数等。 如果您只想获取任何$PATH目录中的可执行文件/脚本,那么使用compgen. 您可以comm用来显示除别名、关键字和函数之外的所有命令: comm -23 \ <(compgen -c | sort -u) \ <(compgen -akA function | sort -u) 但是,这也将删除既是别名/函数又是命令的命令(例如ls,或者grep在 Ubuntu 中默认具有别名,以及您自己添加的任何内容)。 因此,我认为您最好$PATH使用自己的脚本获取所有可执行文件(如果您希望可以添加builtinsusing 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) Raffa 2021-03-03T05:53:37+08:002021-03-03T05:53:37+08:00 要打印别名,请运行: 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)"将排除关键字。
对于
compgen
(我认为一般是 Linux),命令是您可以运行的所有内容,包括别名和函数等。如果您只想获取任何
$PATH
目录中的可执行文件/脚本,那么使用compgen
.您可以
comm
用来显示除别名、关键字和函数之外的所有命令:但是,这也将删除既是别名/函数又是命令的命令(例如
ls
,或者grep
在 Ubuntu 中默认具有别名,以及您自己添加的任何内容)。因此,我认为您最好
$PATH
使用自己的脚本获取所有可执行文件(如果您希望可以添加builtins
usingcompgen -b
):要打印别名,请运行:
要打印函数,请运行:
或者
要打印命令(不包括别名、关键字和函数),请运行:
grep -wv "$(alias | grep -oP '\w+(?=\=)')"
将排除别名。grep -wv "$(declare -F | awk '{print $3}')"
将排除功能。grep -wFv "$(compgen -k)"
将排除关键字。