
¿Qué puedo escribir en mi shell (que resulta ser bash
) que enumere todos los comandos reconocidos?
Además, ¿esto difiere según el caparazón? ¿O todos los shells simplemente tienen un "directorio" de comandos que reconocen?
En segundo lugar, una pregunta diferente, pero ¿cómo puedo anular cualquiera de ellas? En otras palabras, ¿cómo puedo escribir mi propio view
comando para reemplazar el que existe en mi sistema Ubuntu, que parece simplemente cargarse vim
?
Respuesta1
Puedes usarcompgen
compgen -c # will list all the commands you could run.
Para su información:
compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.
Respuesta2
Un shell conoce cuatro tipos de comandos.
- Alias: son apodos para un comando con algunas opciones. Están definidos en el archivo de inicialización del shell (
~/.bashrc
para bash). - Funciones: son fragmentos de código shell a los que se les da un nombre. Al igual que los alias, se definen en el archivo de inicialización del shell.
- Funciones integradas: el shell viene con una pequeña cantidad de comandos integrados. La mayoría de las funciones integradas manipulan el estado del shell (
cd
cambia el directorio actual,set
cambia las opciones y los parámetros posicionales,export
cambia el entorno,…). La mayoría de los shells ofrecen en gran medida las mismas funciones integradas, pero cada shell tiene algunas extensiones del conjunto básico. - Comandos externos: son independientes del shell. Al igual que otros programas, el shell ejecuta programas externos buscándolos en elruta de búsqueda ejecutable. La
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¹.
Puedes ver a qué tipo de comando corresponde un nombre ejecutando type some_name
.
Puede enumerar alias ejecutando el alias
integrado sin argumentos. No hay forma de enumerar funciones o complementos integrados que funcionen en todos los shells. Puede encontrar una lista de funciones integradas en la documentación del shell.
En bash, el set
incorporado enumera funciones con sus definiciones y variables. En bash, ksh o zsh, typeset -f
enumera funciones con sus definiciones. En bash, puedes enumerar todos los nombres de comandos de cualquier tipo con compgen -c
. Puede utilizar compgen -A alias
, compgen -A builtin
compgen -A function
para enumerar comandos de un tipo específico. Puede pasar una cadena adicional para compgen
enumerar solo los comandos que comienzan con ese prefijo.
En zsh, puede enumerar los comandos actualmente disponibles de un tipo determinado con , y echo ${(k)aliases}
( echo ${(k)functions}
este último enumera solo comandos externos).echo ${(k)builtins}
echo ${(k)commands}
El siguiente fragmento independiente del shell enumera todos los programas externos disponibles:
case "$PATH" in
(*[!:]:) PATH="$PATH:" ;;
esac
set -f; IFS=:
for dir in $PATH; do
set +f
[ -z "$dir" ] && dir="."
for file in "$dir"/*; do
if [ -x "$file" ] && ! [ -d "$file" ]; then
printf '%s = %s\n' "${file##*/}" "$file"
fi
done
done
Hay un caso extremo en Bash: comandos hash.
Manual de referencia de bashdice:
Se realiza una búsqueda completa de los directorios en $PATH solo si el comando no se encuentra en la tabla hash
Intentar:
set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat
La PATH
variable de entorno no contiene ni se muestra ~/dir-for-wat-command
, pero puede ejecutarla .compgen -c
wat
wat
Si desea seguir un comando existente,definir un alias o una función.
¹ Excepción: algunas funciones integradas (llamadaselementos incorporados especiales) no puede ser sombreado por una función; sin embargo, bash y zsh no cumplen con POSIX en ese punto en su modo predeterminado.
Respuesta3
Pruebe esto, usandointento:
( # usage of a sub processus: the modificaion of PATH variable is local in ( )
PATH+=:EOF # little hack to list last PATH dir
printf '%s\n' ${PATH//:/\/* }
)
Respuesta4
Si presiona la tecla tabulador 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:alias de shell.