首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash: compgen -c不返回我想要的输出

bash: compgen -c不返回我想要的输出
EN

Ask Ubuntu用户
提问于 2021-03-02 11:50:26
回答 2查看 800关注 0票数 2
代码语言:javascript
复制
compgen -c | sort -b | uniq | less

同时显示函数和关键字(幸运的是没有别名),相反,我想要的不是关键字、函数或别名。用几句话来说,只有命令。

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

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2021-03-02 14:53:18

对于compgen (我认为是对于一般的Linux),命令就是可以运行的所有东西,包括别名和函数等等。

如果您只想在任何$PATH目录中获取可执行文件/脚本,那么使用compgen是没有好办法的。

您可以使用comm显示不包括别名、关键字和函数的所有命令:

代码语言:javascript
复制
comm -23 \
  <(compgen -c | sort -u) \
  <(compgen -akA function | sort -u)

但是,这也将删除别名/函数和命令的命令(例如,lsgrep在Ubuntu中每个默认值都有一个别名,以及您自己添加的任何命令)。

因此,我认为最好使用自己的脚本从$PATH获取所有可执行文件(如果您希望可以使用compgen -b添加builtins ):

代码语言:javascript
复制
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)
票数 3
EN

Ask Ubuntu用户

发布于 2021-03-02 13:53:37

要打印别名,请运行:

代码语言:javascript
复制
alias

要打印函数,请运行:

代码语言:javascript
复制
declare -F

代码语言:javascript
复制
declare -f

要打印命令(不包括别名关键字函数 ),请运行:

代码语言:javascript
复制
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)"将排除关键字。
票数 0
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1320484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档