Eu criei uma função aptget
e a originei:
$ type aptget
aptget is a function
aptget ()
{
sudo apt-get install -y $@
}
Aqui estão as primeiras linhas do build.sh
script:
#!/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
Ao tentar usar o aptget
script bash, ele não foi encontrado?
Talvez esteja faltando algo muito simples aqui ubuntu 18.04
. Dicas apreciadas.
Responder1
Em geral, as funções do shell não devem ser usadas fora do shell em que estão definidas, entãoesta respostaestá certo. No entanto, no Bashvocê consegue fazer isso:
export -f aptget
Aí você liga build.sh
e ele deve saber a função. Isso depende do fato de seu intérprete ser bash
. Em geral, outros shells não verão a função. Se você reescrever o script para que ele use outro intérprete, provavelmente perderá a capacidade de chamar aptget
de dentro do script.
Nota geral lateral: o nome do seu script já é enganoso, sugere que o intérprete é sh
. Suponha que o roteiro tenha crescido e você decidiu que é hora de reescrevê-lo python
ou algo assim. Você gostaria de fazer isso sem alterar seu nome, porque talvez outros scripts o utilizem (através do nome antigo, obviamente). Portanto build.sh
não é um bom nome; build
talvez.
A maneira canônica é criar um script nomeado aptget
e colocá-lo em um diretório para onde você PATH
aponta. O script deve fazer o que sua função faz. Algumas funções não podem ser substituídas por scripts (por exemplo, quando se destinam a manipular variáveis do shell de chamada), mas sua função específica pode. Depois de criar um script, a função em si não será necessária.
Então aptget
chamado de outro script deve funcionar.
Responder2
As funções do shell não são exportadas para subshells. Se quiser que build.sh tenha acesso às funções de shell definidas em sua instância de shell atual, você deverá originá-lo para que seja executado em sua instância atual. Se você chamá-lo normalmente, uma nova instância de shell será criada para executá-lo, e esse novo subshell não terá acesso às funções de shell de sua instância de shell atual.