Wie lassen sich andere Skripte am besten einbinden?

353

Normalerweise fügen Sie ein Skript mit "source" ein.

z.B:

main.sh:

#!/bin/bash

source incl.sh

echo "The main script"

inkl.sh:

echo "The included script"

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

The included script
The main script

... Wenn Sie nun versuchen, dieses Shell-Skript von einem anderen Speicherort aus auszuführen, kann es das Include nur finden, wenn es sich in Ihrem Pfad befindet.

Was ist ein guter Weg, um sicherzustellen, dass Ihr Skript das Include-Skript findet, insbesondere wenn das Skript beispielsweise portabel sein muss?

Aaron H.
quelle
2
siehe dieses: stackoverflow.com/questions/59895/…
Lluís
1
Ihre Frage ist so gut und informativ, dass meine Frage beantwortet wurde, bevor Sie Ihre Frage gestellt haben! Gut gemacht!
Gabriel Staples

Antworten:

229

Ich neige dazu, meine Skripte alle relativ zueinander zu machen. Auf diese Weise kann ich dirname verwenden:

#!/bin/sh

my_dir="$(dirname "$0")"

"$my_dir/other_script.sh"
Chris Boran
quelle
5
Dies funktioniert nicht, wenn das Skript über $ PATH ausgeführt wird. dann which $0wird nützlich sein
Hugo
41
Es gibt keine zuverlässige Möglichkeit, den Speicherort eines Shell-Skripts zu bestimmen, siehe mywiki.wooledge.org/BashFAQ/028
Philipp
12
@Philipp, Der Autor dieses Eintrags ist korrekt, es ist komplex und es gibt Fallstricke. Aber es fehlen einige wichtige Punkte. Erstens geht der Autor von vielen Dingen darüber aus, was Sie mit Ihrem Bash-Skript machen werden. Ich würde auch nicht erwarten, dass ein Python-Skript ohne seine Abhängigkeiten ausgeführt wird. Bash ist eine Klebesprache, mit der Sie schnell Dinge erledigen können, die sonst schwierig wären. Wenn Ihr Build-System funktioniert, gewinnt Pragmatismus (und eine nette Warnung, dass das Skript keine Abhängigkeiten finden kann).
Aaron H.
11
Ich habe gerade etwas über das BASH_SOURCEArray gelernt und wie das erste Element in diesem Array immer auf die aktuelle Quelle verweist.
Haridsv
6
Dies funktioniert nicht, wenn sich die Skripte an verschiedenen Orten befinden. Beispiel: /home/me/main.sh ruft /home/me/test/inc.sh auf, da der Name / home / me zurückgibt. sacii Antwort mit BASH_SOURCE ist eine bessere Lösung stackoverflow.com/a/12694189/1000011
opticyclic
187

Ich weiß, dass ich zu spät zur Party komme, aber das sollte funktionieren, egal wie Sie das Skript starten und ausschließlich integrierte Funktionen verwenden:

DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. "$DIR/incl.sh"
. "$DIR/main.sh"

.(dot) Befehl ist ein Alias ​​für source, $PWDist der Pfad für das Arbeitsverzeichnis, BASH_SOURCEist eine Array-Variable, deren Mitglieder die Quelldateinamen sind, entfernt die ${string%substring}kürzeste Übereinstimmung von $ substring von der Rückseite von $ string

sacii
quelle
7
Dies ist die einzige Antwort in dem Thread, die konsequent für mich funktioniert hat
Justin
3
@sacii Darf ich wissen, wann die Leitung if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fibenötigt wird? Ich kann eine Notwendigkeit dafür finden, wenn die Befehle in eine Bash-Eingabeaufforderung eingefügt werden, um ausgeführt zu werden. Wenn ich jedoch in einem Skriptdateikontext ausgeführt werde, kann ich keine Notwendigkeit dafür erkennen ...
Johnny Wong
2
Es ist auch erwähnenswert, dass es über mehrere sources hinweg wie erwartet funktioniert (ich meine, wenn Sie sourceein Skript haben, das sich sourcein einem anderen Verzeichnis befindet usw.), funktioniert es immer noch).
Ciro Costa
4
Sollte das nicht so sein ${BASH_SOURCE[0]}, dass Sie nur den neuesten Anruf wünschen? Mit DIR=$(dirname ${BASH_SOURCE[0]})können Sie auch die if-Bedingung loswerden
kshenoy
1
Sind Sie bereit, dieses Snippet unter einer Lizenz ohne Attribut wie CC0 verfügbar zu machen oder es einfach öffentlich zugänglich zu machen? Ich würde dieses Wort gerne wörtlich verwenden, aber es ist ärgerlich, die Zuordnung an die Spitze jedes einzelnen Skripts zu setzen!
BeeOnRope
52

Eine Alternative zu:

scriptPath=$(dirname $0)

ist:

scriptPath=${0%/*}

.. der Vorteil ist, dass Sie nicht von dirname abhängig sind, was kein integrierter Befehl ist (und in Emulatoren nicht immer verfügbar ist).

verspätet
quelle
2
basePath=$(dirname $0)gab mir einen leeren Wert, wenn die enthaltene Skriptdatei bezogen wurde.
Gebet
41

Wenn es sich im selben Verzeichnis befindet, können Sie Folgendes verwenden dirname $0:

#!/bin/bash

source $(dirname $0)/incl.sh

echo "The main script"
dsm
quelle
2
Zwei Fallstricke: 1) $0is ./t.shund dirname kehren zurück .; 2) nach cd binder Rücksendung .ist nicht korrekt. $BASH_SOURCEist nicht besser.
18446744073709551615
Eine weitere Gefahr: Versuchen Sie dies mit Leerzeichen im Verzeichnisnamen.
Hubert Grzeskowiak
source "$(dirname $0)/incl.sh"funktioniert für diese Fälle
dsm
27

Ich denke, der beste Weg, dies zu tun, besteht darin, den Weg von Chris Boran zu verwenden, ABER Sie sollten MY_DIR folgendermaßen berechnen:

#!/bin/sh
MY_DIR=$(dirname $(readlink -f $0))
$MY_DIR/other_script.sh

So zitieren Sie die Manpages für readlink:

readlink - display value of a symbolic link

...

  -f, --canonicalize
        canonicalize  by following every symlink in every component of the given 
        name recursively; all but the last component must exist

Ich bin noch nie auf einen Anwendungsfall gestoßen, bei dem die MY_DIRBerechnung nicht korrekt ist. Wenn Sie über einen Symlink in Ihrem Skript auf Ihr Skript zugreifen $PATH, funktioniert es.

Mat131
quelle
Schöne und einfache Lösung, die für mich in so vielen Variationen des Skriptaufrufs bekannt ist, wie ich mir vorstellen kann. Vielen Dank.
Brian Cline
Gibt es neben Problemen mit fehlenden Anführungszeichen einen tatsächlichen Anwendungsfall, in dem Sie die symbolischen Links auflösen möchten, anstatt sie $0direkt zu verwenden?
10b0
1
@ l0b0: Stellen Sie sich vor, Ihr Skript ist /home/you/script.shSie können cd /homeund führen Sie Ihr Skript von dort aus wie ./you/script.shin diesem Fall dirname $0wird zurückkehren ./youund das Einschließen anderer
Skripte
1
Toller Vorschlag, ich musste jedoch Folgendes tun, damit es meine Variablen in `MY_DIR=$(dirname $(readlink -f $0)); source $MY_DIR/incl.sh
Frederick Ollinger
21

Eine Kombination der Antworten auf diese Frage bietet die robusteste Lösung.

Es funktionierte für uns in produktionsfähigen Skripten mit großer Unterstützung von Abhängigkeiten und Verzeichnisstrukturen:

#! / bin / bash

# Vollständiger Pfad des aktuellen Skripts
THIS = `readlink -f" $ {BASH_SOURCE [0]} "2> / dev / null || echo $ 0`

# Das Verzeichnis, in dem sich das aktuelle Skript befindet
DIR = `dirname" $ ​​{THIS} "`

# 'Punkt' bedeutet 'Quelle', dh 'Einschließen':
. "$ DIR / compile.sh"

Die Methode unterstützt alle diese:

  • Leerzeichen im Pfad
  • Links (via readlink)
  • ${BASH_SOURCE[0]} ist robuster als $0
Brian Haak
quelle
1
DIESES = readlink -f "${BASH_SOURCE[0]}" 2>/dev/null||echo $0 wenn Ihr Readlink BusyBox v1.01 ist
Alexx Roche
@AlexxRoche danke! Funktioniert das unter allen Linuxes?
Brian Haak
1
Ich würde es erwarten. Scheint unter Debian Sid 3.16 und QNAPs armv5tel 3.4.6 Linux zu funktionieren.
Alexx Roche
2
Ich habe es in diese eine Zeile gesetzt:DIR=$(dirname $(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null||echo $0)) # https://stackoverflow.com/a/34208365/
Acumenus
20
SRC=$(cd $(dirname "$0"); pwd)
source "${SRC}/incl.sh"
Max
quelle
1
Ich vermute, dass Sie für die "CD ..." gestimmt wurden, wenn der Dirname "$ 0" dasselbe erreichen sollte ...
Aaron H.
7
Dieser Code gibt den absoluten Pfad zurück, auch wenn das Skript aus dem aktuellen Verzeichnis ausgeführt wird. $ (dirname "$ 0") allein gibt nur "zurück."
Max
1
Und wird ./incl.shauf den gleichen Pfad wie cd+ aufgelöst pwd. Was ist der Vorteil eines Verzeichniswechsels?
10b0
Manchmal benötigen Sie den absoluten Pfad des Skripts, z. B. wenn Sie Verzeichnisse hin und her wechseln müssen.
Laryx Decidua
15

Dies funktioniert auch dann, wenn das Skript verwendet wird:

source "$( dirname "${BASH_SOURCE[0]}" )/incl.sh"
Alessandro Pezzato
quelle
Können Sie erklären, was der Zweck von "[0]" ist?
Ray
1
@Ray BASH_SOURCEist ein Array von Pfaden, die einem Aufrufstapel entsprechen. Das erste Element entspricht dem neuesten Skript im Stapel, dem aktuell ausgeführten Skript. Tatsächlich wird $BASH_SOURCEeine als Variable aufgerufene Variable standardmäßig auf ihr erstes Element erweitert, sodass [0]dies hier nicht erforderlich ist. Siehe diesen Link für Details.
Jonathan H
10

1. Am ordentlichsten

Ich habe fast jeden Vorschlag untersucht und hier ist der ordentlichste, der für mich funktioniert hat:

script_root=$(dirname $(readlink -f $0))

Es funktioniert auch, wenn das Skript mit einem $PATHVerzeichnis verknüpft ist .

Sehen Sie es hier in Aktion: https://github.com/pendashteh/hcagent/blob/master/bin/hcagent

2. Das coolste

# Copyright https://stackoverflow.com/a/13222994/257479
script_root=$(ls -l /proc/$$/fd | grep "255 ->" | sed -e 's/^.\+-> //')

Dies ist eigentlich eine andere Antwort auf dieser Seite, aber ich füge sie auch meiner Antwort hinzu!

2. Das zuverlässigste

In dem seltenen Fall, dass diese nicht funktionierten, ist hier der kugelsichere Ansatz:

# Copyright http://stackoverflow.com/a/7400673/257479
myreadlink() { [ ! -h "$1" ] && echo "$1" || (local link="$(expr "$(command ls -ld -- "$1")" : '.*-> \(.*\)$')"; cd $(dirname $1); myreadlink "$link" | sed "s|^\([^/].*\)\$|$(dirname $1)/\1|"); }
whereis() { echo $1 | sed "s|^\([^/].*/.*\)|$(pwd)/\1|;s|^\([^/]*\)$|$(which -- $1)|;s|^$|$1|"; } 
whereis_realpath() { local SCRIPT_PATH=$(whereis $1); myreadlink ${SCRIPT_PATH} | sed "s|^\([^/].*\)\$|$(dirname ${SCRIPT_PATH})/\1|"; } 

script_root=$(dirname $(whereis_realpath "$0"))

Sie können es in Aktion in der taskrunnerQuelle sehen: https://github.com/pendashteh/taskrunner/blob/master/bin/taskrunner

Hoffe das hilft jemandem da draußen :)

Bitte hinterlassen Sie es auch als Kommentar, wenn einer für Sie nicht funktioniert hat, und geben Sie Ihr Betriebssystem und Ihren Emulator an. Vielen Dank!

Alexar
quelle
7

Sie müssen den Speicherort der anderen Skripte angeben, es gibt keinen anderen Weg, um dies zu umgehen. Ich würde eine konfigurierbare Variable oben in Ihrem Skript empfehlen:

#!/bin/bash
installpath=/where/your/scripts/are

. $installpath/incl.sh

echo "The main script"

Alternativ können Sie darauf bestehen, dass der Benutzer eine Umgebungsvariable verwaltet, die angibt, wo sich Ihr Programm zu Hause befindet, z. B. PROG_HOME oder ähnliches. Dies kann für den Benutzer automatisch bereitgestellt werden, indem in /etc/profile.d/ ein Skript mit diesen Informationen erstellt wird, das bei jeder Anmeldung eines Benutzers abgerufen wird.

Steve Baker
quelle
1
Ich schätze den Wunsch nach Spezifität, aber ich kann nicht verstehen, warum der vollständige Pfad erforderlich sein sollte, es sei denn, die Include-Skripte waren Teil eines anderen Pakets. Ich sehe keinen Sicherheitsunterschied beim Laden von einem bestimmten relativen Pfad (dh demselben Verzeichnis, in dem das Skript ausgeführt wird) gegenüber einem bestimmten vollständigen Pfad. Warum führt kein Weg daran vorbei?
Aaron H.
4
Da sich in dem Verzeichnis, in dem Ihr Skript ausgeführt wird, nicht unbedingt die Skripte befinden, die Sie in Ihr Skript aufnehmen möchten. Sie möchten die Skripte dort laden, wo sie installiert sind, und es gibt keine zuverlässige Möglichkeit, festzustellen, wo sich diese zur Laufzeit befinden. Wenn Sie keinen festen Speicherort verwenden, können Sie auch das falsche (dh vom Hacker bereitgestellte) Skript einfügen und ausführen.
Steve Baker
6

Ich würde vorschlagen, dass Sie ein Setenv-Skript erstellen, dessen einziger Zweck darin besteht, Speicherorte für verschiedene Komponenten in Ihrem System bereitzustellen.

Alle anderen Skripte würden dann dieses Skript als Quelle verwenden, sodass alle Speicherorte für alle Skripte mit dem Setenv-Skript gleich sind.

Dies ist sehr nützlich, wenn Sie Cronjobs ausführen. Wenn Sie cron ausführen, erhalten Sie eine minimale Umgebung. Wenn Sie jedoch festlegen, dass alle cron-Skripte zuerst das setenv-Skript enthalten, können Sie die Umgebung steuern und synchronisieren, in der die cronjobs ausgeführt werden sollen.

Wir haben eine solche Technik bei unserem Build-Affen verwendet, die für die kontinuierliche Integration in ein Projekt von etwa 2.000 kSLOC verwendet wurde.

Rob Wells
quelle
3

Steves Antwort ist definitiv die richtige Technik, sollte jedoch überarbeitet werden, damit sich Ihre Installationspfadvariable in einem separaten Umgebungsskript befindet, in dem alle derartigen Deklarationen abgegeben werden.

Dann beziehen alle Skripte dieses Skript und sollten sich der Installationspfad ändern, müssen Sie es nur an einem Ort ändern. Macht die Dinge zukunftssicherer. Gott, ich hasse dieses Wort! (-:

Übrigens: Sie sollten die Variable wirklich mit $ {installpath} referenzieren, wenn Sie sie wie in Ihrem Beispiel gezeigt verwenden:

. ${installpath}/incl.sh

Wenn die geschweiften Klammern weggelassen werden, versuchen einige Shells, die Variable "installpath / incl.sh" zu erweitern!

Rob Wells
quelle
3

Shell Script Loader ist meine Lösung dafür.

Es bietet eine Funktion namens include (), die in vielen Skripten mehrmals aufgerufen werden kann, um auf ein einzelnes Skript zu verweisen, das Skript jedoch nur einmal lädt. Die Funktion kann vollständige oder teilweise Pfade akzeptieren (das Skript wird in einem Suchpfad durchsucht). Eine ähnliche Funktion namens load () wird ebenfalls bereitgestellt, mit der die Skripte bedingungslos geladen werden.

Es funktioniert für bash , ksh , pd ksh und zsh mit optimierten Skripten für jedes von ihnen; und andere Shells, die generisch mit dem Original-Sh kompatibel sind, wie Asche , Armaturenbrett , Erbstück Sh usw., über ein universelles Skript, das seine Funktionen abhängig von den Funktionen, die die Shell bieten kann, automatisch optimiert.

[Geflügeltes Beispiel]

start.sh

Dies ist ein optionales Starterskript. Das Platzieren der Startmethoden hier ist nur eine Annehmlichkeit und kann stattdessen im Hauptskript platziert werden. Dieses Skript wird auch nicht benötigt, wenn die Skripte kompiliert werden sollen.

#!/bin/sh

# load loader.sh
. loader.sh

# include directories to search path
loader_addpath /usr/lib/sh deps source

# load main script
load main.sh

main.sh

include a.sh
include b.sh

echo '---- main.sh ----'

# remove loader from shellspace since
# we no longer need it
loader_finish

# main procedures go from here

# ...

Asche

include main.sh
include a.sh
include b.sh

echo '---- a.sh ----'

b.sh.

include main.sh
include a.sh
include b.sh

echo '---- b.sh ----'

Ausgabe:

---- b.sh ----
---- a.sh ----
---- main.sh ----

Das Beste daran ist, dass darauf basierende Skripte auch zu einem einzigen Skript mit dem verfügbaren Compiler kompiliert werden können.

Hier ist ein Projekt, das es verwendet: http://sourceforge.net/p/playshell/code/ci/master/tree/ . Es kann portabel mit oder ohne Kompilieren der Skripte ausgeführt werden. Das Kompilieren zur Erstellung eines einzelnen Skripts kann ebenfalls erfolgen und ist bei der Installation hilfreich.

Ich habe auch einen einfacheren Prototyp für jede konservative Partei erstellt, die eine kurze Vorstellung davon haben möchte, wie ein Implementierungsskript funktioniert: https://sourceforge.net/p/loader/code/ci/base/tree/loader-include-prototype .bash . Es ist klein und jeder kann den Code einfach in sein Hauptskript aufnehmen, wenn er möchte, wenn sein Code mit Bash 4.0 oder neuer ausgeführt werden soll, und er wird auch nicht verwendet eval.

konsolebox
quelle
3
12 Kilobyte Bash-Skript mit über 100 Zeilen evaled-Code zum Laden von Abhängigkeiten. Autsch
l0b0
1
Genau einer der drei evalBlöcke in Bodennähe wird immer ausgeführt. Also, ob es benötigt wird oder nicht, es wird sicher verwendet eval.
10b0
3
Dieser Eval-Aufruf ist sicher und wird nicht verwendet, wenn Sie über Bash 4.0+ verfügen. Ich verstehe, Sie sind einer dieser alten Schreiber, die denken, es evalsei rein böse, und nicht wissen, wie sie es stattdessen gut gebrauchen sollen.
konsolebox
1
Ich weiß nicht, was du mit "nicht verwendet" meinst, aber es wird ausgeführt. Und nach einigen Jahren des Shell-Scripting als Teil meines Jobs bin ich mehr denn je davon überzeugt, dass evaldas böse ist.
10b0
1
Zwei tragbare, einfache Möglichkeiten zum Markieren von Dateien fallen sofort ein: Entweder durch ihre Inode-Nummer oder durch Einfügen von NUL-getrennten Pfaden in eine Datei.
10b0
2

Legen Sie alle Bibliotheken persönlich in einem libOrdner ab und importladen Sie sie mithilfe einer Funktion.

Ordnerstruktur

Geben Sie hier die Bildbeschreibung ein

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 und Sie Ihre Bibliotheken dann einfach wie folgt importieren können:

import "utils"
import "requirements"

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

IMPORTED="$BASH_SOURCE"

Jetzt haben Sie Zugriff auf Funktionen innerhalb utils.shund requirements.shvonscript.sh

TODO: Schreiben Sie einen Linker, um eine einzelne shDatei zu erstellen

Xaqron
quelle
Behebt dies auch das Problem der Ausführung des Skripts außerhalb des Verzeichnisses, in dem es sich befindet?
Aaron H.
@ AaronH. Nein. Es ist eine strukturierte Methode, um Abhängigkeiten in große Projekte einzubeziehen.
Xaqron
1

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 abzurufen

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

Ich benutze dieses Skript und es hat mir immer gut gedient :)

francoisrv
quelle
1

Ich habe alle meine Startskripte in einem .bashrc.d-Verzeichnis abgelegt. Dies ist eine übliche Technik an Orten wie /etc/profile.d usw.

while read file; do source "${file}"; done <<HERE
$(find ${HOME}/.bashrc.d -type f)
HERE

Das Problem mit der Lösung mit Globbing ...

for file in ${HOME}/.bashrc.d/*.sh; do source ${file};done

... ist, dass Sie möglicherweise eine Dateiliste haben, die "zu lang" ist. Ein Ansatz wie ...

find ${HOME}/.bashrc.d -type f | while read file; do source ${file}; done

... läuft, ändert aber nicht die gewünschte Umgebung.

phreed
quelle
1

Natürlich für jeden sein eigenes, aber ich denke, der Block unten ist ziemlich solide. Ich glaube, dies beinhaltet 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 ist möglicherweise der "beste" Weg, um andere Skripte einzuschließen. Dies basiert auf einer anderen "besten" Antwort, die einem Bash-Skript mitteilt, wo es gespeichert ist

Modulitos
quelle
1

Dies sollte zuverlässig funktionieren:

source_relative() {
 local dir="${BASH_SOURCE%/*}"
 [[ -z "$dir" ]] && dir="$PWD"
 source "$dir/$1"
}

source_relative incl.sh
PSkocik
quelle
0

wir müssen nur den Ordner herausfinden, in dem unsere inkl.sh und main.sh gespeichert sind; Ändern Sie einfach Ihre main.sh damit:

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"
fastrizwaan
quelle
Falsche Angabe, unnötige Verwendung von echound falscher Verwendung von sed‚s - gOption. -1.
10b0
Wie auch immer, um dieses Skript zum SCRIPT_DIR=$(echo "$0" | sed "s/${SCRIPT_NAME}//")source "${SCRIPT_DIR}incl.sh"
Laufen zu
0

Entsprechend man hiergeeigneter Stelle für das Skript ist/usr/local/lib/

/ usr / local / lib

Dateien, die lokal installierten Programmen zugeordnet sind.

Persönlich bevorzuge ich /usr/local/lib/bash/includesfür enthält. Es gibt eine Bash-Helfer- Bibliothek, um Bibliotheken auf diese Weise einzuschließen:

#!/bin/bash

. /usr/local/lib/bash/includes/bash-helpers.sh

include api-client || exit 1                   # include shared functions
include mysql-status/query-builder || exit 1   # include script functions

# include script functions with status message
include mysql-status/process-checker; status 'process-checker' $? || exit 1
include mysql-status/nonexists; status 'nonexists' $? || exit 1

Bash-Helfer enthalten Statusausgabe

Alexander Yancharuk
quelle
-5

Sie können auch verwenden:

PWD=$(pwd)
source "$PWD/inc.sh"
Django
quelle
9
Sie gehen davon aus, dass Sie sich in demselben Verzeichnis befinden, in dem sich die Skripte befinden. Es wird nicht funktionieren, wenn Sie woanders sind.
Luc M