¿Existe una forma "fácil" de ejecutar un comando de estilo "ls -la" para enumerar todos los archivos / binarios ejecutables en la RUTA actual?
(Tengo la intención de canalizar la salida en grep, para buscar comandos con prefijos desconocidos pero básicamente "nombres" conocidos, el tipo de caso en el que la finalización automática / tabulación en bash es esencialmente inútil. Por lo tanto, algún tipo de "auto inverso" característica completa "...)
bash
ls
path
autocomplete
sme
fuente
fuente
ls -la
?Respuestas:
fuente
which $(compgen -A function -abck)
?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.Como muchas cosas, esto es más fácil en zsh.
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 globalN
para obtener una expansión vacía si no hay una coincidencia seguida por el modificador de historialt
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:
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.fuente
^
parece no generar salida para una llamada "sin argumentos"? Si lo suelta, puede enumerarlos a todos y aún buscar palabras clave individuales (pero no una lista de ellas). El(Non:t)
parece decir que los asteriscos deberían expandirse? No pude resolver ese último.path
, pero cuando lo ejecuto en el shell, de hecho es $ PATH pero con espacios en lugar de:
. El resto es claro como el cristal :)$path
es una característica de zsh: es un parámetro vinculado , una matriz que se actualiza automáticamente cuandoPATH
se actualiza y viceversa.el find solo coincide con eso: tiene al menos un conjunto de bits "x" (ejecutable), y ese no es un directorio.
y úsalo con una lista de expresiones regulares que encontrarás:
fuente
echo $PATH | tr ':' '\n' | sort | uniq -d
primero hacemos eco
$PATH
en sed y reemplazamos ":" con "".luego hacemos una búsqueda en cada una de esas cosas para encontrar archivos con rwx y hacerles eco.
2> /dev/null
es asífind
que no imprime erroresfuente
-maxdepth 1
y-type f
en su búsqueda, de lo contrario encontrará subdirectorios y sus archivos (que la búsqueda de RUTA no lo hará). Además, su prueba de permiso es extraña, ¿debería ser+x
, creo?:/bin
o/bin::/usr/bin
. Intenta agregars/::/:.:/;s/^:/.:/;s/:$/:./
alsed
comando.find
puede buscar más rutas, por lo que puede hacerlo sin el bucle: porfind $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
supuesto, los nombres de directorio que contienen espacios lo estropearán, pero el bucle basado tiene el mismo problema de todos modos.for
. Entoncesfor
recorrerá una lista de 4 palabras. Para manipular la división de palabras mejor establecer elIFS
acuerdo a su necesidad:IFS=':'; find $PATH -perm +rwx …
.