是否可以which
在 glob 模式上使用该命令来返回多个结果?
例如,我想知道所有latex
命令的完整路径。我可以尝试:
[lucas@lucas-ThinkPad-W520]/home/lucas$ which latex
/usr/bin/latex
或者:
[lucas@lucas-ThinkPad-W520]/home/lucas$ which pdflatex
/usr/bin/pdflatex
或者:
[lucas@lucas-ThinkPad-W520]/home/lucas$ which xelatex
/usr/bin/xelatex
但我不能使用:
[lucas@lucas-ThinkPad-W520]/home/lucas$ which *latex
它什么也不返回。
关于如何在which
命令中使用 glob 模式有什么建议吗?
答案1
使用zsh
(请注意,which
仅内置于tcsh
or中zsh
,在其他 shell 中它可以给出随机结果,type
在 Bourne 等 shell 中使用):
$ which -m '*latex'
/usr/bin/arlatex
/usr/bin/dvilualatex
/usr/bin/fig4latex
/usr/bin/latex
/usr/bin/lualatex
/usr/bin/pdflatex
/usr/bin/pod2latex
/usr/bin/pslatex
或者(如果您只想考虑可执行文件而不是函数、别名...):
$ ls -ld $^path/*latex(-*DN)
lrwxrwxrwx 1 root root 53 Apr 8 03:14 /usr/bin/arlatex -> ../share/texlive/texmf-dist/scripts/bundledoc/arlatex*
lrwxrwxrwx 1 root root 6 Apr 8 03:51 /usr/bin/dvilualatex -> luatex*
lrwxrwxrwx 1 root root 55 Apr 8 03:51 /usr/bin/fig4latex -> ../share/texlive/texmf-dist/scripts/fig4latex/fig4latex*
lrwxrwxrwx 1 root root 6 Apr 8 03:51 /usr/bin/latex -> pdftex*
lrwxrwxrwx 1 root root 6 Apr 8 03:51 /usr/bin/lualatex -> luatex*
lrwxrwxrwx 1 root root 6 Apr 8 03:51 /usr/bin/pdflatex -> pdftex*
-rwxr-xr-x 1 root root 10340 May 20 2013 /usr/bin/pod2latex*
lrwxrwxrwx 1 root root 54 Apr 8 03:14 /usr/bin/pslatex -> ../share/texlive/texmf-dist/scripts/texlive/pslatex.sh*
使用其他类似 Bourne 的 shell,您可以执行以下操作:
searchPATH() (
pattern=$1
IFS=:; set -f; set -- $PATH
set +f; IFS=
for i do
for j in "$i"/$pattern; do
[ -x "$j" ] && printf '%s\n' "$j"
done
done
)
进而:
$ searchPATH '*latex'
/usr/bin/arlatex
/usr/bin/dvilualatex
/usr/bin/fig4latex
/usr/bin/latex
/usr/bin/lualatex
/usr/bin/pdflatex
/usr/bin/pod2latex
/usr/bin/pslatex
这应该更能发挥最常见的价值观$PATH
。如果以(如)$PATH
结尾,它将省略当前目录中的条目:
/bin:/usr/bin:
答案2
和重击, 使用compgen
和type
内置函数,假设命令名称中没有换行符:
IFS=$'\n'; set -f; type -p -- $(compgen -c | grep 'latex$')