Функция Bash выдает ошибку «команда не найдена» при использовании в скрипте Bash?

Функция Bash выдает ошибку «команда не найдена» при использовании в скрипте Bash?

Я создал функцию aptgetи получил ее источник:

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

Вот первые несколько строк из build.shсценария:

#!/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

При попытке использовать aptgetвнутреннюю часть bash-скрипта он не найден??

введите описание изображения здесь

Может быть, я упускаю что-то простое.. Это на ubuntu 18.04. Советы приветствуются.

решение1

В общем случае функции оболочки не предназначены для использования за пределами оболочки, в которой они определены, поэтомуэтот ответправильно. Однако в Башевы можете сделать это:

export -f aptget

Затем вы вызываете, build.shи он должен знать функцию. Это основано на том факте, что его интерпретатор — bash. В общем случае другие оболочки не увидят функцию. Если вы перепишете скрипт так, чтобы он использовал другой интерпретатор, вы, скорее всего, потеряете возможность вызывать aptgetиз скрипта.

Примечание общего характера: название вашего скрипта уже вводит в заблуждение, оно предполагает, что интерпретатор — sh. Предположим, скрипт вырос, и вы решили, что пришло время переписать его в pythonили что-то в этом роде. Вы хотели бы сделать это, не меняя его названия, потому что, возможно, другие скрипты используют его (через старое название, очевидно). Поэтому build.shэто нехорошее название; buildможет быть.

Канонический способ — создать скрипт с именем aptgetи поместить его в каталог, на который PATHуказывает ваш. Скрипт должен делать то же, что и ваша функция. Некоторые функции не могут быть заменены скриптами (например, когда они предназначены для управления переменными вызывающей оболочки), но ваша конкретная функция может. После создания скрипта сама функция не понадобится.

Тогда aptgetвызов из другого скрипта должен просто работать.

решение2

Функции оболочки не экспортируются в подоболочки. Если вы хотите, чтобы build.sh имел доступ к функциям оболочки, определенным в вашем текущем экземпляре оболочки, вы должны указать его источник, чтобы он запускался в вашем текущем экземпляре. Если вы вызовете его обычным образом, для его запуска будет запущен новый экземпляр оболочки, и этот новый подоболочка не будет иметь доступа к функциям оболочки вашего текущего экземпляра оболочки.

Связанный контент