Comando Linux para enumerar todos los comandos y alias disponibles


280

¿Hay un comando de Linux que enumere todos los comandos y alias disponibles para esta sesión de terminal?

Como si hubiera escrito 'a' y presionado tabulador, pero para cada letra del alfabeto. O ejecutando 'alias' pero también devolviendo comandos.

¿Por qué? Me gustaría ejecutar lo siguiente y ver si hay un comando disponible:

ListAllCommands | grep searchstr

presione el botón TAB dos veces para enumerar todos los comandos disponibles con el entorno
ntshetty

Respuestas:


599

Puedes usar el bash (1) incorporado compgen

  • compgen -c enumerará todos los comandos que podría ejecutar.
  • compgen -a enumerará todos los alias que podrías ejecutar.
  • compgen -b enumerará todos los elementos integrados que podría ejecutar.
  • compgen -k enumerará todas las palabras clave que podría ejecutar.
  • compgen -A function enumerará todas las funciones que podría ejecutar.
  • compgen -A function -abck enumerará todo lo anterior de una vez.

Consulte la página de manual para ver otras terminaciones que puede generar.

Para responder directamente a su pregunta:

compgen -ac | grep searchstr

deberías hacer lo que quieras.


1
¿Hay un equivalente a esto para csh / tcsh? Esos terminales también tienen algún tipo de función de autocompletado que se usa en la pestaña, así que ¿existe algo?
krb686

2
En lugar de compgen | grep, puede ser más eficiente pasar la cadena como argumento a compgensí misma (si se sabe que es un prefijo, como se implica en la pregunta). En este caso, eso sería compgen -ac searchstr.
Toby Speight

En realidad, ubuntu muestra 'nada apropiado' whatis compgeny 'Sin entrada manual' para man compgen.
MarAvFe

1
@MarAvFe: Eso es porque es un bashcomando incorporado, no un comando separado con su propia página de manual. Deberá leer la bash(1)página de manual o ejecutar help compgenen una bashlínea de comando.
camh

Por extensión, haciendo compgen -c | sort | uniq | lessimprimirá todos los comandos disponibles sin líneas duplicadas y ordenados alfabéticamente.
Fabián

39

Añadir a .bashrc

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

Si también quieres alias, entonces:

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}

Esto está muy cerca pero no incluye alias. ¿Cómo puedo agregar alias | cortar -f1 a los resultados pero antes de la ordenación?
ack

1
¿Por qué molestarse en ordenar si el único propósito es poner la salida a través de grep de todos modos? La filosofía de Unix es crear herramientas simples y luego encadenarlas si es necesario, de modo que deje de lado ListAllCommands y si el usuario desea ordenar la salida, puede hacerlo.
danio

44
El orden es eliminar duplicados.
Ants Aasma

1
Esto no encuentra comandos que sean enlaces simbólicos a ejecutables. Use la opción -Lpara seguir enlaces simbólicos a su destino. Nota: -Les una opción y no forma parte de la expresión coincidente, por lo que debe colocarse antes de la ruta en la línea de comando. En este casofind -L {}
Adaephon

1
Es posible que desee redirigir STDERR a / dev / null para suprimir las advertencias de directorio inexistentes. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 para compatibilidad con zsh)
TheLonelyGhost

27

Ahí está el

type -a mycommand

comando que enumera todos los alias y comandos en $ PATH donde se usa mycommand . Se puede usar para verificar si el comando existe en varias variantes. Aparte de eso ... Probablemente hay algún script que analiza $ PATH y todos los alias, pero no sé acerca de tal script.


1
Incluso si no es una respuesta a la pregunta, creo que es una mejor solución al problema que el llamado a grep. Por lo tanto, puede escribir -a foo y si foo no está disponible, devuelve el comando no encontrado o algo así. Por lo tanto, puede verificar un comando sin invocar el comando en sí.
Janusz

1
En realidad, es una respuesta a la pregunta, ya que el OP preguntó "Me gustaría ejecutar lo siguiente y ver si hay un comando disponible", por lo que el propósito es ver si hay un comando disponible y esta respuesta claramente funciona.
lothar

2
@lothar, ¿qué pasa si el comando que está buscando es, uh, qué era "startserver", "serverstart", "server-something-u-other"? Lo sé, simplemente "grep -i" para el servidor y veré si está allí. Ups Bzzz, no con esta solución. amigo :-) No voy a rechazar esta respuesta (ya que es útil incluso de forma limitada) pero una solución completa tendría en cuenta que grep es para expresiones regulares , no solo cadenas fijas.
paxdiablo

6

Use "which searchstr". Devuelve la ruta del binario o la configuración de alias si es un alias

Editar: si está buscando una lista de alias, puede usar:

alias -p | cut -d= -f1 | cut -d' ' -f2

Agregue eso a la respuesta de búsqueda de RUTA que desee. Asume que estás usando bash ..


6

El otro comando no funcionó para mí en sistemas integrados, porque requieren bash o una versión más completa de xargs (busybox era limitado).

Los siguientes comandos deberían funcionar en cualquier sistema tipo Unix.

Lista por carpeta:

ls $(echo $PATH | tr ':' ' ')

Listar todos los comandos por nombre

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

Esto todavía se basa tr. ¿Por qué no simplemente ls $(echo ${PATH//:/ })?
mschilli

5

Prueba este script:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done

Esta es la única solución de código hasta ahora que lo hace para todos los comandos, no solo para ver si existe un comando conocido. +1.
paxdiablo

3

Para usuarios de Mac ( hallazgo no tiene -executable y xargs no tiene -d):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'

Gracias por esto. De hecho, estoy usando un Unix no Mac donde la respuesta @AntsAasma no funcionó. Esto funciona para mí en Mac y mi Unix también. ¿Qué comando puedo escribir para determinar la versión de Unix en la que estoy, para que pueda responder aquí para ayudar a otros con mi problema?
prismaticorb

Linux <corporate_proprietary_build_info_here> Lun Dec 12 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

Es útil enumerar los comandos en función de las palabras clave asociadas con el comando.

Utilizar: man -k "your keyword"

siéntase libre de combinar con:| grep "another word"

por ejemplo, para encontrar un editor de texto: man -k editor | grep text


2

Intenta presionar ALT-? (alt y signo de interrogación al mismo tiempo). Dale uno o dos segundos para construir la lista. Debería funcionar en bash.


3
O intente presionar Esc al comienzo de una línea en blanco cuatro veces.
Ephemient

Eso es increíblemente útil, y aún no lo sabía gracias :-)
Chris Huang-Leaver

2

Aquí hay una solución que le brinda una lista de todos los ejecutables y alias. También es portátil para sistemas sin xargs -d(por ejemplo, Mac OS X), y maneja correctamente las rutas con espacios en ellas.

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

Uso: myscript.sh [grep-options] patternpor ejemplo, para encontrar todos los comandos que comienzan con lsmayúsculas y minúsculas, haga lo siguiente:

myscript -i ^ls

2

Método de acceso directo para enumerar todos los comandos. Abra la terminal y presione dos veces el botón "tab" . Eso muestra todos los comandos en la terminal


1
¿Y lo entiendes grepexactamente cómo?
Toby Speight

2

Alternativamente, puede obtener una lista conveniente de comandos junto con descripciones rápidas (siempre que el comando tenga una página de manual, que es la mayoría):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

Entonces solo lo agarras como quieres.

apropos -s 1 '' | grep xdg

rendimientos:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

Los resultados no parecen estar ordenados, por lo que si está buscando una lista larga, puede arrojar un | ordenar | en el medio, y luego canalizar eso a un buscapersonas como less / more / most. ala:

apropos -s 1 '' | sort | grep zip | less

Lo que devuelve una lista ordenada de todos los comandos que tienen "zip" en su nombre o su breve descripción, y bombea ese buscapersonas "menos". (También puede reemplazar "menos" con $ PAGER y usar el localizador predeterminado).


1

Siempre puedes lo siguiente:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

El shell ejecutará el comando solo si están listados en la ruta env var de todos modos.


1

depende, con eso quiero decir que depende de qué shell estás usando. Aquí están las restricciones que veo:

  1. debe ejecutarse en el mismo proceso que su shell, para detectar alias y funciones y variables que afectarían los comandos que puede encontrar, piense en PATH o EDITOR aunque EDITOR podría estar fuera de alcance. Puede tener variables no exportadas que pueden afectar las cosas.
  2. es específico de la shell o se va al kernel, / proc / pid / enviorn y sus amigos no tienen suficiente información

Uso ZSH, así que aquí hay una respuesta zsh, hace las siguientes 3 cosas:

  1. camino de vertederos
  2. vuelca nombres de alias
  3. vuelca funciones que están en el entorno
  4. los ordena

aquí está:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

Si usa zsh, esto debería hacerlo.


0

El problema es que la finalización de pestañas está buscando su ruta, pero todos los comandos no están en su ruta.

Para encontrar los comandos en su ruta usando bash, puede hacer algo como:

para x en echo $PATH | cut -d":" -f1; hacer ls $ x; hecho


0

Aquí hay una función que puede poner en su archivo bashrc:

función de búsqueda de comandos
{
   oldIFS = $ {IFS}
   IFS = ":"

   para p en $ {PATH}
   hacer
      ls $ p | grep $ 1
   hecho

   exportar IFS = $ {oldIFS}
}

Ejemplo de uso:

$ comando-search gnome
gnome-audio-profiles-properties *
gnome-eject @
llavero de gnomo *
gnome-keyring-daemon *
montaje en gnomo *
gnome-open *
gnome-sound-recorder *
gnome-text-editor @
gnome-umount @
gnome-volume-control *
autorización de polkit-gnome *
vim.gnome *
PS

FYI: IFS es una variable que bash usa para dividir cadenas.

Ciertamente, podría haber algunas formas mejores de hacer esto.


-1

tal vez estoy malentendido, pero ¿qué pasa si presionas Escape hasta que tengas las posibilidades de Mostrar todo X?


-2
compgen -c > list.txt && wc list.txt

1
Considere agregar una breve descripción de lo que esto hace o cómo se supone que funciona. Como mínimo, especifique un enlace de referencia (generalmente la página de manual relevante) para hacer un seguimiento y comprender la solución propuesta.
TheCodeArtist

Usar un archivo no siempre es una buena opción. Si es necesario, al menos conviértalo en un archivo tmp (si la seguridad no es un problema)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

¿Por qué no escribes?

seachstr

En la terminal

El caparazón dirá algo como

seacrhstr: command not found 

EDITAR:

Ok, tomo el voto negativo, porque la respuesta es estúpida, solo quiero saber: ¡¿Qué tiene de malo esta respuesta! El autor de la pregunta dijo:

y ver si hay un comando disponible.

¡Escribir el comando te dirá si está disponible !.

Probablemente él / ella quiso decir "sin ejecutar el comando" o "incluirlo en un guión" pero no puedo leer su mente (no es que no pueda hacerlo regularmente, es solo que está usando un deflector de lectura mental )


44
Quiero saber si formathddexiste el comando. Oh, espera, solo para ejecutarlo y ver. Caramba. Gracias :)
Jeffrey Jose

55
Probablemente sea más seguro usar 'cuál' para hacer eso.
danio

Dado que esto es Stack Overflow , no Super User , una respuesta programática sería más apropiada.
Toby Speight

-5

en debian: ls / bin / | grep "whatImSearchingFor"


1
Los ejecutables existen en todos los directorios en $ PATH, no solo en / bin.
PhrkOnLsh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.