
Я создал функцию 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 имел доступ к функциям оболочки, определенным в вашем текущем экземпляре оболочки, вы должны указать его источник, чтобы он запускался в вашем текущем экземпляре. Если вы вызовете его обычным образом, для его запуска будет запущен новый экземпляр оболочки, и этот новый подоболочка не будет иметь доступа к функциям оболочки вашего текущего экземпляра оболочки.