¿Qué puedo escribir en mi shell (que resulta ser bash) que enumerará todos los comandos que se reconocen?
Además, ¿esto difiere según el shell? ¿O todos los shells solo tienen un "directorio" de comandos que reconocen?
En segundo lugar, una pregunta diferente, pero ¿cómo puedo anular cualquiera de esos? En otras palabras, ¿cómo puedo escribir mi propio viewcomando para reemplazar el existente en mi sistema Ubuntu, que parece cargarse vim?

Respuestas:
Puedes usar
compgenFYI:
fuente
compgen -cincluirá cosas como{owhileque no son estrictamente comandos.Un shell conoce cuatro tipos de comandos.
~/.bashrcpara bash).cdcambia el directorio actual,setcambia las opciones y los parámetros posicionales,exportcambia el entorno, ...). La mayoría de los shell ofrecen en gran medida los mismos componentes incorporados, pero cada shell tiene algunas extensiones del conjunto básico.PATHvariable de entorno contiene una lista de directorios separados por dos puntos para buscar programas.En caso de que haya comandos de varios tipos con el mismo nombre, se ejecuta la primera coincidencia en el orden anterior¹.
Puede ver a qué tipo de comando corresponde un nombre ejecutando
type some_name.Puede enumerar los alias ejecutando el
aliasincorporado sin argumento. No hay forma de enumerar funciones o funciones que funcionen en todos los shells. Puede encontrar una lista de incorporados en la documentación del shell.En bash, la
setlista integrada de funciones con sus definiciones, así como las variables. En bash, ksh o zsh,typeset -fenumera las funciones con sus definiciones. En bash, puede enumerar todos los nombres de comandos de cualquier tipo concompgen -c. Puede usarcompgen -A alias,compgen -A builtincompgen -A functionpara enumerar comandos de un tipo específico. Puede pasar una cadena adicional acompgenpara enumerar solo los comandos que comienzan con ese prefijo.En zsh, puede listar los comandos disponibles en la actualidad de un tipo dado con
echo ${(k)aliases},echo ${(k)functions},echo ${(k)builtins}yecho ${(k)commands}(esto último se enumeran los comandos externos solamente).El siguiente fragmento agnóstico de shell enumera todos los programas externos disponibles:
Hay un caso límite en Bash: comandos hash.
El Manual de referencia de Bash dice:
Tratar:
La
PATHvariable de entorno no contiene~/dir-for-wat-command,compgen -cno se muestrawat, pero puede ejecutarsewat.Si desea sombrear un comando existente, defina un alias o una función .
¹ Excepción: algunas funciones incorporadas (llamadas incorporadas especiales ) no pueden ser sombreadas por una función; sin embargo, bash y zsh no cumplen con POSIX en ese punto en su modo predeterminado.
fuente
$PATHlike/bin:/usr/bin:(final:), donde fallaría al enumerar los archivos ejecutables en el directorio actual.La lista de comandos consta de dos conjuntos:
PATHNo puede cambiar las funciones incorporadas, pero puede evitar que el shell use una función incorporada especificando el nombre de ruta completo como
/bin/echo.En cuanto a los comandos en su
PATH, puede cambiar eso.PATHes una lista de directorios separados por dos puntos para buscar comandos. El primer archivo coincidente encontrado "gana".(Esta sintaxis no funciona para
cshshells derivados, sino todos los demás que conozco).Eso se exporta
PATHcon~/binla primera entrada seguida del resto de lasPATHentradas existentes . Entonces, su shell verificarádirectory calledbinin your home directory for a command *first* before checking the standardPATH` el sistema configurado. Puede hacer que compruebe el nuevo directorio al final usando en su lugar:Para que
PATHpersista en futuros inicios de sesión, agréguelo a uno.profileu otro archivo rc de shell.fuente
Prueba esto, usando bash :
fuente
Si presiona la tecla tab dos veces y luego y, obtendrá la lista de todos los comandos disponibles en su shell actual. Para la segunda pregunta, creo que deberías usar alias: shell alias .
fuente