Aquí hay una función que enumera el contenido de los directorios $PATH
. Si pasa argumentos, la función solo enumera los comandos cuyo nombre contiene uno de los argumentos. Los argumentos se interpretan como patrones globales.
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
}
Como muchas cosas, esto es más fácil en zsh.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
El ^
carácter en la expansión de parámetros hace que el texto concatenado con la matriz se agregue a cada elemento de la matriz, por ejemplo, path=(/bin /usr/bin); echo $^path/foo
impresiones /bin/foo /usr/bin/foo
.
/*$^@*
parece un insulto al cómic, pero de hecho es el personaje ordinario /
, el comodín *
, el parámetro especial $@
(la matriz de parámetros posicionales) con el ^
modificador, y de nuevo *
.
(N:t)
es el calificador global N
para obtener una expansión vacía si no hay una coincidencia seguida por el modificador de historial t
para mantener solo el nombre base ("cola") de cada coincidencia.
Más críptico, evita la llamada externa, pero esto es solo de interés cosmético:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
De hecho, puede estar buscando el apropos
comando, que busca páginas del comando man cuya descripción breve contiene una palabra clave. Una limitación es que esto solo encuentra comandos que tienen una página de manual.
ls -la
?