Creé una función aptget
y la obtuve:
$ type aptget
aptget is a function
aptget ()
{
sudo apt-get install -y $@
}
Aquí están las primeras líneas del build.sh
guió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 aptget
interior de un script bash, no se encuentra?
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.sh
y 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 aptget
desde 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 python
o 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; build
tal vez.
La forma canónica es crear un script llamado aptget
y colocarlo en un directorio al que PATH
apunta. 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, aptget
llamar 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.