¿Dónde se almacenan las funciones de shell en Linux?

11

Al principio, estaba buscando la razón por la que whichno sale nada después de darle ciertos programas como argumento, por ejemplo cd.

Por lo que he encontrado aquí , la razón probablemente sea que cden mi máquina hay una función, que se confirma al ejecutarse type cd.

TLDR: Pero como los programas normales que whichpueden ubicarse gracias a las $PATHvariables se colocan en una de esas $PATHcarpetas, ¿dónde se cdalmacenan las funciones o los scripts ?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
Gabrijel Šimunović
fuente
Consigo cd is a shell builtin. Eche un vistazo a la página de manual de su shell (zsh?)
Xen2050
1
Echa un vistazo a unix.stackexchange.com/questions/85249/… El problema es el que es un comando heredado que no debe usarse, especialmente debido a cosas como esta pregunta.
Joe

Respuestas:

12

Funciones definidas por el usuario.

Por lo general, las funciones de bash se almacenan permanentemente en un bashscript de inicio.

  • Scripts de inicio de todo el sistema: /etc/profilepara shells de inicio de sesión y /etc/bashrcpara shells interactivos.
  • El usuario define los scripts ~/.bash_profilede inicio : para shells de inicio de sesión y ~/.bashrcpara shells interactivos.
  • Puede encontrar más información sobre shells interactivos / de inicio de sesión en la manpágina bash en la sección INVOCACIÓN.

Las funciones de shell definidas por el usuario se cargan dinámicamente en un hash (o tabla de búsqueda) cuando se inicia bash. Desde el archivo fuente bash, variable.cla definición de la tabla es:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Las funciones definidas por el usuario se pueden enumerar con el declarecomando bash , aún se utilizan otros shells typeset. En bash declareha reemplazado el typesetcomando.

declare -f

Las funciones existen en la memoria durante la vida útil del bash shell.

Funciones definidas por shell (integradas)

Estas son funciones comunes, tales como echo, printf, cdy :. Se compilan en una biblioteca que está vinculada al bashejecutable. Construir las definiciones en el ejecutable ahorra tiempo en comparación con cargar una definición externa. Las definiciones de estas funciones (contenidas en .defarchivos fuente que se analizan en fuente C) se guardan en el builtinsdirectorio de fuente bash.

Un lado útil: para obtener información sobre el uso de un comando de shell incorporado help <command>. p.ej

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
sospechoso
fuente
Gracias por ese extracto de respuesta. Esto es exactamente lo que he estado buscando. ¿Crees que hay una herramienta para seguir el proceso de creación de funciones bash o algo así typesetque mostraría qué archivo / script causó la creación / cambio de una función?
Gabrijel Šimunović
No conozco ninguna herramienta de este tipo: sería una opción útil para el comando declareo typesetpara mostrar el archivo fuente de una definición de función. Creo que es un problema de ingeniería de software. Recientemente encontré una función de shell definida en un .aliasarchivo, ¡no es lo que esperaba!
sospechoso
8

Las funciones de shell se almacenan en la memoria del shell (o, tal vez, en archivos temporales no documentados). No existen en cualquier forma utilizable hasta que inicia el shell (por ejemplo, cuando se conecta a una CLI, o iniciar una ventana de shell como xterm) y se definen (por ejemplo, mediante la lectura .bashrc, .bash_profileo algo similar) y dejan de existe cuando el shell termina.

G-Man dice 'restablecer a Mónica'
fuente
1
La naturaleza efímera de algo que escribe en el indicador es importante. Mi voto va a esta respuesta. Si escribe cd () { pwd; builtin cd "$@"; }en el símbolo del sistema, el único lugar que está almacenado es en la memoria de su shell actualmente en ejecución. (Mi ejemplo es Bash, pero el mismo principio se aplica a cualquier caparazón)
Tripleee
6

cdy otros comandos comunes como echo, typey aliasse llaman builtins .

Los comandos incorporados están contenidos dentro del propio shell y los diferentes shells pueden tener diferentes comandos integrados.

Nifle
fuente
44
No sé si vale la pena enfatizar que el código ejecutable para los comandos incorporados como cdestá contenido en el programa de shell en sí, por ejemplo, dentro del archivo /bin/bashsi ese es su shell. (Creo que su redacción aquí es clara, pero he visto a personas confundirse por todo tipo de cosas).
David Z
1

La pregunta del Superusuario Encontrar la definición de una función bash está estrechamente relacionada con esta. El usuario HairOfTheDog proporcionó esta respuesta (parafraseada):

Los siguientes comandos informarán la ubicación (nombre de archivo y número de línea) de la definición de una función. Asumiendo una función llamada foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Por ejemplo, la salida de estos comandos podría ser:

foo 32 /source/private/main/developer/cue.pub.sh

Lo anterior podría funcionar solo en bash, y no en shells POSIX en general.

¡Gracias a Blue Raspberry por encontrar esto!

G-Man
fuente