A função Bash fornece "comando não encontrado" quando usada em um script bash?

A função Bash fornece "comando não encontrado" quando usada em um script bash?

Eu criei uma função aptgete a originei:

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

Aqui estão as primeiras linhas do build.shscript:

#!/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 aptgetscript bash, ele não foi encontrado?

insira a descrição da imagem aqui

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.she 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 aptgetde 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 pythonou 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.shnão é um bom nome; buildtalvez.

A maneira canônica é criar um script nomeado aptgete colocá-lo em um diretório para onde você PATHaponta. 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 aptgetchamado 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.

informação relacionada