¿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 view
comando para reemplazar el existente en mi sistema Ubuntu, que parece cargarse vim
?
Respuestas:
Puedes usar
compgen
FYI:
fuente
compgen -c
incluirá cosas como{
owhile
que no son estrictamente comandos.Un shell conoce cuatro tipos de comandos.
~/.bashrc
para bash).cd
cambia el directorio actual,set
cambia las opciones y los parámetros posicionales,export
cambia 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.PATH
variable 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
alias
incorporado 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
set
lista integrada de funciones con sus definiciones, así como las variables. En bash, ksh o zsh,typeset -f
enumera 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 builtin
compgen -A function
para enumerar comandos de un tipo específico. Puede pasar una cadena adicional acompgen
para 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
PATH
variable de entorno no contiene~/dir-for-wat-command
,compgen -c
no 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
$PATH
like/bin:/usr/bin:
(final:
), donde fallaría al enumerar los archivos ejecutables en el directorio actual.La lista de comandos consta de dos conjuntos:
PATH
No 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.PATH
es una lista de directorios separados por dos puntos para buscar comandos. El primer archivo coincidente encontrado "gana".(Esta sintaxis no funciona para
csh
shells derivados, sino todos los demás que conozco).Eso se exporta
PATH
con~/bin
la primera entrada seguida del resto de lasPATH
entradas existentes . Entonces, su shell verificarádirectory called
binin your home directory for a command *first* before checking the standard
PATH` el sistema configurado. Puede hacer que compruebe el nuevo directorio al final usando en su lugar:Para que
PATH
persista en futuros inicios de sesión, agréguelo a uno.profile
u 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