¿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/fooimpresiones/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 globalNpara obtener una expansión vacía si no hay una coincidencia seguida por el modificador de historialtpara 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
aproposcomando, 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 :)$pathes una característica de zsh: es un parámetro vinculado , una matriz que se actualiza automáticamente cuandoPATHse 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 -dprimero hacemos eco
$PATHen 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/nulles asífindque no imprime erroresfuente
-maxdepth 1y-type fen 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?:/bino/bin::/usr/bin. Intenta agregars/::/:.:/;s/^:/.:/;s/:$/:./alsedcomando.findpuede 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. Entoncesforrecorrerá una lista de 4 palabras. Para manipular la división de palabras mejor establecer elIFSacuerdo a su necesidad:IFS=':'; find $PATH -perm +rwx ….