459 Stimmen

Wie lassen sich andere Skripte am besten einbinden?

Normalerweise würde man ein Skript mit "source" einbinden

z. B:

main.sh:

#!/bin/bash

source incl.sh

echo "The main script"

incl.sh:

echo "The included script"

Die Ausgabe der Ausführung von "./main.sh" ist:

The included script
The main script

... Wenn Sie nun versuchen, das Shell-Skript von einem anderen Ort aus auszuführen, kann es das Include nicht finden, es sei denn, es befindet sich in Ihrem Pfad.

Wie kann man sicherstellen, dass das Skript das Include-Skript findet, insbesondere wenn das Skript beispielsweise portabel sein muss?

1voto

Joaommp Punkte 57

Die meisten Antworten, die ich hier gesehen habe, scheinen die Dinge zu sehr zu verkomplizieren. Diese Methode hat bei mir immer zuverlässig funktioniert:

FULLPATH=$(readlink -f $0)
INCPATH=${FULLPATH%/*}

INCPATH enthält den vollständigen Pfad des Skripts ohne den Dateinamen des Skripts, unabhängig davon, wie das Skript aufgerufen wird (durch $PATH, relativ oder absolut).

Danach muss man dies nur noch tun, um Dateien im selben Verzeichnis einzubinden:

. $INCPATH/file_to_include.sh

Referenz: TecPorto / Standortunabhängig umfasst

1voto

Xaqron Punkte 27851

Ich persönlich lege alle Bibliotheken in einem lib Ordner und verwenden Sie ein import Funktion, um sie zu laden.

Ordnerstruktur

enter image description here

script.sh Inhalt

# Imports '.sh' files from 'lib' directory
function import()
{
  local file="./lib/$1.sh"
  local error="\e[31mError: \e[0mCannot find \e[1m$1\e[0m library at: \e[2m$file\e[0m"
  if [ -f "$file" ]; then
     source "$file"
    if [ -z $IMPORTED ]; then
      echo -e $error
      exit 1
    fi
  else
    echo -e $error
    exit 1
  fi
}

Beachten Sie, dass diese Importfunktion am Anfang Ihres Skripts stehen sollte, dann können Sie Ihre Bibliotheken einfach wie folgt importieren:

import "utils"
import "requirements"

Fügen Sie am Anfang jeder Bibliothek (z. B. utils.sh) eine einzelne Zeile hinzu:

IMPORTED="$BASH_SOURCE"

Jetzt haben Sie Zugriff auf Funktionen innerhalb von utils.sh y requirements.sh de script.sh

TODO: Einen Linker schreiben, um eine einzelne sh fichier

1voto

modulitos Punkte 12535

Natürlich muss jeder für sich selbst entscheiden, aber ich denke, der folgende Block ist ziemlich solide. Ich glaube, es geht um den "besten" Weg, ein Verzeichnis zu finden, und den "besten" Weg, ein anderes Bash-Skript aufzurufen:

scriptdir=`dirname "$BASH_SOURCE"`
source $scriptdir/incl.sh

echo "The main script"

Dies könnte also der "beste" Weg sein, um andere Skripte einzubinden. Dies basiert auf einer anderen "besten" Antwort, die sagt einem Bash-Skript, wo es gespeichert ist

1voto

francoisrv Punkte 2287

Wenn Sie source oder $0 verwenden, erhalten Sie nicht den tatsächlichen Pfad Ihres Skripts. Sie können die Prozess-ID des Skripts verwenden, um den tatsächlichen Pfad zu ermitteln

ls -l       /proc/$$/fd           | 
grep        "255 ->"            |
sed -e      's/^.\+-> //'

Ich verwende dieses Skript und es hat mir immer gute Dienste geleistet :)

0voto

fastrizwaan Punkte 170

Müssen wir nur den Ordner herausfinden, in dem unsere incl.sh und main.sh gespeichert sind; ändern Sie einfach Ihre main.sh mit dieser:

main.sh

#!/bin/bash

SCRIPT_NAME=$(basename $0)
SCRIPT_DIR="$(echo $0| sed "s/$SCRIPT_NAME//g")"
source $SCRIPT_DIR/incl.sh

echo "The main script"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X