Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash:获取以给定字符串开头的命令列表_Linux_Bash_Scripting - Fatal编程技术网

Linux bash:获取以给定字符串开头的命令列表

Linux bash:获取以给定字符串开头的命令列表,linux,bash,scripting,Linux,Bash,Scripting,是否可以使用Bash获取以特定字符串开头的命令列表? 我希望在键入命令的开头后两次得到打印内容,例如,将其存储在变量中。迭代$PATH变量,并对路径中的每个目录执行ls beginingford* 要使其完全等效,您需要只筛选出可执行文件并按名称排序(使用ls标志和sort命令应该很容易)。点击时列出的是路径中以该字符串开头的二进制文件。因此,如果PATH变量包含: PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib/java/bin:/u

是否可以使用Bash获取以特定字符串开头的命令列表?

我希望在键入命令的开头后两次得到打印内容,例如,将其存储在变量中。

迭代$PATH变量,并对路径中的每个目录执行
ls beginingford*


要使其完全等效,您需要只筛选出可执行文件并按名称排序(使用ls标志和sort命令应该很容易)。

点击时列出的是路径中以该字符串开头的二进制文件。因此,如果PATH变量包含: PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib/java/bin:/usr/lib/java/jre/bin:/usr/lib/qt/bin:/usr/share/texmf/bin:

Bash将查看这些目录中的每一个,在您点击后向您显示建议。因此,要将以“ls”开头的命令列表放入变量中,可以执行以下操作: MYVAR=$(ls/usr/local/bin/ls*/usr/bin/ls*/bin/ls*)
当然,您可以添加我没有添加的所有其他目录。

您应该能够使用compgen命令,如下所示:

compgen -A builtin [YOUR STRING HERE]
例如,“compgen-A builtin l”返回

您可以使用其他关键字代替“builtin”来获得其他类型的完成。Builtin为您提供shell内置命令。“文件”提供本地文件名等

以下是操作列表(来自使用compgen的complete的BASH手册页):


如果您想知道bash将如何完成

COMPLETIONS=$(compgen -c "$WORD")

compgen使用bash在制表时使用的相同规则完成操作。

JacobM的答案很好。对于手动操作,我将使用以下内容:

echo $PATH  | tr : '\n' | 
 while read p; do 
  for i in $p/mod*; do
   [[ -x "$i" && -f "$i" ]] && echo $i     
  done
 done

输出前的测试确保只显示可执行的常规文件。上面显示了以
mod
开头的所有命令

有趣的是,我不知道
compgen
。这里有一个脚本,我用它来做,它不检查非可执行文件:

#!/bin/bash
echo $PATH | tr ':' '\0' | xargs -0 ls | grep "$@" | sort
将该脚本保存在
$PATH
(我将其命名为
findcmd
),
chmod u+w
中,然后像
grep
一样使用它,传递您最喜欢的选项和模式:

findcmd ^foo   # finds all commands beginning with foo
findcmd -i -E 'ba+r'  # finds all commands matching the pattern 'ba+r', case insensitively

为了好玩,另一个手动版本:

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f -perm -001 -print
其中
pattern
指定要使用的文件名模式。这将丢失不是全局可执行但您有权限执行的命令

[在Mac OS X上测试]


使用
-或
-和
标志构建此命令的更全面版本:

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f
                                   \( \
                                       -perm -001 -or \
                                       \( -perm -100 -and -user $(whoami)\) \
                                   \) -print

将拾取您拥有权限的文件。我看不到一个通用的方法来获得所有那些你可以通过团队关系执行的东西,而不需要更多的编码。

一个有趣的方法是点击
M-*
(Meta通常是左键)

例如,键入以下内容:

$ lo
然后点击
M-*

$ loadkeys loadunimap local locale localedef locale-gen locate
  lockfile-create lockfile-remove lockfile-touch logd logger login
  logname logout logprof logrotate logsave look lorder losetup 

您可以在
man 3 readline
中阅读更多关于此的信息;这是
readline
库的一项功能。

nice。我挣扎着完成了,但还没有弄明白如何使用它+1:)确实非常有用,而且回答得很好。谢谢(+1)此列表是否内置?
$ lo
$ loadkeys loadunimap local locale localedef locale-gen locate
  lockfile-create lockfile-remove lockfile-touch logd logger login
  logname logout logprof logrotate logsave look lorder losetup