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 aptget
dentro de um script bash, ele não é encontrado?
Talvez eu esteja perdendo algo muito simples aqui ubuntu 18.04
. Dicas apreciadas.
Em geral, as funções do shell não devem ser usadas fora do shell em que são definidas, portanto, esta resposta está correta. No entanto, no Bash, você pode fazer isso :
Aí você liga
build.sh
e ele deve saber a função. Isso depende do fato de que seu interpretador ébash
. Em geral, outros shells não verão a função. Se você reescrever o script para que ele use outro interpretador, provavelmente perderá a capacidade de chamaraptget
de dentro do script.Nota geral lateral: o nome do seu script já é enganoso, sugere que o interpretador é
sh
. Suponha que o roteiro tenha crescido e você decidiu que é hora de reescrevê-lopython
ou algo assim. Você gostaria de fazer isso sem alterar seu nome, porque talvez outros scripts o usem (através do nome antigo, obviamente). Portantobuild.sh
, não é um bom nome;build
talvez.A maneira canônica é criar um script nomeado
aptget
e colocá-lo em um diretórioPATH
para o qual você 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.Em seguida,
aptget
chamado de outro script, deve funcionar.As funções de shell não são exportadas para subshells. Se você deseja que build.sh tenha acesso às funções de shell definidas em sua instância de shell atual, você deve criá-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.