Bash-Funktion gibt „Befehl nicht gefunden“ aus, wenn sie in einem Bash-Skript verwendet wird?

Bash-Funktion gibt „Befehl nicht gefunden“ aus, wenn sie in einem Bash-Skript verwendet wird?

Ich habe eine Funktion erstellt aptgetund als Quelle angegeben:

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

Hier sind die ersten Zeilen des build.shSkripts:

#!/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, aptgetwird es nicht gefunden??

Bildbeschreibung hier eingeben

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.shund 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 bashaufzurufen .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 pythonoder 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.shist kein guter Name; buildvielleicht.

Die kanonische Methode besteht darin, ein Skript mit dem Namen zu erstellen aptgetund es in einem Verzeichnis abzulegen, PATHauf 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 aptgetsollte 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.

verwandte Informationen