使用 glob 模式作为“which”的参数

使用 glob 模式作为“which”的参数

是否可以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仅内置于tcshor中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

重击, 使用compgentype 内置函数,假设命令名称中没有换行符:

IFS=$'\n'; set -f; type -p -- $(compgen -c | grep 'latex$')

相关内容