¿La función Bash proporciona "comando no encontrado" cuando se usa dentro de un script bash?

¿La función Bash proporciona "comando no encontrado" cuando se usa dentro de un script bash?

Creé una función aptgety la obtuve:

$ type aptget
aptget is a function
aptget () 
{ 
    sudo apt-get install -y $@
}

Aquí están las primeras líneas del build.shguión:

#!/bin/bash

sudo apt remove -y x264 libx264-dev

#aptget build-essential checkinstall cmake pkg-config yasm
aptget git gfortran
aptget libjpeg8-dev libjasper-dev libpng12-dev
aptget libtiff5-dev

aptget libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
aptget libxine2-dev libv4l-dev

¿Al intentar utilizar el aptgetinterior de un script bash, no se encuentra?

ingrese la descripción de la imagen aquí

Quizás me estoy perdiendo algo muy simple aquí. Esto está en ubuntu 18.04. Se agradecen los consejos.

Respuesta1

En general, las funciones del shell no están destinadas a usarse fuera del shell en el que están definidas, por lo queesta respuestaes correcto. Sin embargo en BashPuedes hacerlo:

export -f aptget

Luego llamas build.shy debería conocer la función. Esto se basa en el hecho de que su intérprete es bash. En general, otros shells no verán la función. Si reescribe el script para que utilice otro intérprete, lo más probable es que pierda la capacidad de llamar aptgetdesde el script.

Nota general al margen: el nombre de su guión ya es engañoso, sugiere que el intérprete es sh. Supongamos que el guión ha crecido y decides que es hora de reescribirlo pythono lo que sea. Le gustaría hacer esto sin cambiar su nombre, porque tal vez otros scripts lo usen (obviamente a través del nombre anterior). Por tanto build.sh, no es un buen nombre; buildtal vez.

La forma canónica es crear un script llamado aptgety colocarlo en un directorio al que PATHapunta. El script debe hacer lo que hace su función. Algunas funciones no pueden ser reemplazadas por scripts (por ejemplo, cuando están destinados a manipular variables del shell que llama), pero su función particular sí puede. Después de crear un script, la función en sí no será necesaria.

Luego, aptgetllamar desde otro script debería funcionar.

Respuesta2

Las funciones de Shell no se exportan a subcapas. Si desea que build.sh tenga acceso a las funciones de shell definidas en su instancia de shell actual, debe obtenerlo para que se ejecute en su instancia actual. Si lo llama normalmente, se activará una nueva instancia de shell para ejecutarla y esa nueva subcapa no tendrá acceso a las funciones de shell de su instancia de shell actual.

información relacionada