Ich habe eine Funktion erstellt aptget
und als Quelle angegeben:
$ type aptget
aptget is a function
aptget ()
{
sudo apt-get install -y $@
}
Hier sind die ersten Zeilen des build.sh
Skripts:
#!/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
Beim Versuch, es innerhalb eines Bash-Skripts zu verwenden, aptget
wird es nicht gefunden??
Vielleicht übersehe ich hier etwas ganz Einfaches.. Das ist an ubuntu 18.04
. Tipps sind willkommen.
Antwort1
Im Allgemeinen sind Shell-Funktionen nicht für die Verwendung außerhalb der Shell gedacht, in der sie definiert sind.diese Antwortist richtig. In Bash jedochdu kannst das:
export -f aptget
Dann rufen Sie auf build.sh
und es sollte die Funktion kennen. Dies hängt davon ab, dass sein Interpreter ist . Im Allgemeinen sehen andere Shells die Funktion nicht. Wenn Sie das Skript so umschreiben, dass es einen anderen Interpreter verwendet, verlieren Sie höchstwahrscheinlich die Möglichkeit, aus dem Skript heraus bash
aufzurufen .aptget
Allgemeine Randbemerkung: Der Name Ihres Skripts ist bereits irreführend, da er suggeriert, dass der Interpreter ist sh
. Angenommen, das Skript ist gewachsen und Sie haben beschlossen, es in python
oder was auch immer neu zu schreiben. Sie möchten dies tun, ohne den Namen zu ändern, da es möglicherweise von anderen Skripten verwendet wird (über den alten Namen natürlich). Daher build.sh
ist kein guter Name; build
vielleicht.
Die kanonische Methode besteht darin, ein Skript mit dem Namen zu erstellen aptget
und es in einem Verzeichnis abzulegen, PATH
auf das Ihr verweist. Das Skript sollte das tun, was Ihre Funktion tut. Einige Funktionen können nicht durch Skripte ersetzt werden (z. B. wenn sie Variablen der aufrufenden Shell manipulieren sollen), Ihre spezielle Funktion jedoch schon. Nachdem Sie ein Skript erstellt haben, wird die Funktion selbst nicht mehr benötigt.
Dann aptget
sollte der Aufruf von einem anderen Skript einfach funktionieren.
Antwort2
Shell-Funktionen werden nicht in Subshells exportiert. Wenn Sie möchten, dass build.sh Zugriff auf Shell-Funktionen hat, die in Ihrer aktuellen Shell-Instanz definiert sind, müssen Sie es so bereitstellen, dass es in Ihrer aktuellen Instanz ausgeführt wird. Wenn Sie es normal aufrufen, wird eine neue Shell-Instanz gestartet, um es auszuführen, und diese neue Subshell hat keinen Zugriff auf die Shell-Funktionen Ihrer aktuellen Shell-Instanz.