bash:compgen -c 没有返回我想要的输出

bash:compgen -c 没有返回我想要的输出
compgen -c | sort -b | uniq | less

还显示函数和关键字(幸运的是没有别名),我想要的是所有不是关键字、函数或别名的内容。简而言之,只有命令。

如果命令名与函数名、关键字名或别名匹配;则不能省略命令名。

答案1

对于compgen(我认为对于 Linux 来说),命令是您可以运行的所有内容,包括别名和函数等。

如果您只想获取任何$PATH目录中的可执行文件/脚本,使用 并不是一个好方法compgen

您可以使用comm来显示除别名、关键字和函数之外的所有命令:

comm -23 \
  <(compgen -c | sort -u) \
  <(compgen -akA function | sort -u)

但是,这也会删除既是别名/功能又是命令的命令(例如,lsgrepUbuntu 中默认具有别名,以及您自己添加的任何内容)。

因此,我认为您最好使用$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)"将排除关键字。

相关内容