Answers:
compgen -c # will list all the commands you could run.
compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.
which $(compgen -A function -abck)
?
这是一个列出目录内容的函数$PATH
。如果传递了参数,则该函数仅列出名称包含参数之一的命令。参数被解释为全局模式。
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
像许多事情一样,这在zsh中更容易。
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
参数扩展中的^
字符会导致将与数组连接的文本添加到每个数组元素,例如prints 。看起来像是漫画中的侮辱,但实际上是普通字符,通配符,带修饰符的特殊参数(位置参数的数组),以及。是glob限定符,如果没有匹配项,则得到一个空扩展名,其后是history修饰符,以仅保留每个匹配项的基本名称(“ tail”)。path=(/bin /usr/bin); echo $^path/foo
/bin/foo /usr/bin/foo
/*$^@*
/
*
$@
^
*
(N:t)
N
t
更神秘,避免了外部调用,但这只是表面上的兴趣:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
实际上,您可能正在寻找该apropos
命令,该命令搜索简短说明中包含关键字的命令手册页。一个限制是,它只能查找具有手册页的命令。
^
似乎导致“ no arguments”调用没有输出?如果将其删除,则可以将它们全部列出,并且仍然搜索单个关键字(而不是它们的列表)。在(Non:t)
似乎是说,星号应该扩大?无法找出最后一个。
path
,但是当我在shell中运行它时,它的确是$ PATH,但带有空格而不是:
。其余的一切都很清晰:)
$path
是zsh的功能:它是一个绑定参数,一个数组,在更新时PATH
会自动更新,反之亦然。
function findinpath () {
OLDIFS="$IFS" ;
IFS="$(printf ':\t\n')" ;
for regexp in "$@" ; do
for adir in $PATH ; do
find "$adir" -perm -111 -a ! -type d -ls 2>/dev/null | grep -i "/[^/]*$regexp"
done ;
done ;
IFS="$OLDIFS" ;
}
搜索结果仅匹配:至少设置了一个“ x”(可执行)位,而不是目录。
并将其与正则表达式列表一起使用:
findinpath awk sed '\.sh$'
echo $PATH | tr ':' '\n' | sort | uniq -d
for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done
首先,我们回显$PATH
sed并将“:”替换为“”。
然后我们在所有这些东西上进行查找,以使用rwx查找文件并回显它们。
2> /dev/null
所以find
不会打印错误
-maxdepth 1
和-type f
你的发现,否则你会发现子目录和它们的文件(路径搜索不会)。另外,您的权限测试很奇怪- +x
我认为应该只是为了?
:/bin
或),则无法处理边缘情况/bin::/usr/bin
。尝试添加s/::/:.:/;s/^:/.:/;s/:$/:./
到sed
命令。
find
可以搜索更多路径,因此您可以在不使用循环的情况下执行此操作:find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
当然,包含空格的目录名称会将其弄乱,但是基于循环的目录名称仍然存在相同的问题。
for
。因此for
将遍历4个单词的列表。要更好地操作分词,请IFS
根据需要设置IFS=':'; find $PATH -perm +rwx …
。
ls -la
?