Dateiausführung mit Punktabstand gegen Punktschrägstrich
Ich versuche, mit einer vorhandenen Codebibliothek zu arbeiten, habe jedoch ein Problem festgestellt. Kurz gesagt, ich führe ein Shell-Skript aus (nennen wir diesesA
) derenerster Akt soll ein anderes Skript aufrufen (B
). SkriptB
befindet sich in meinem aktuellen Verzeichnis (eine Voraussetzung für das von mir verwendete Programm). Das Handbuch der Software verweist aufbash
jedoch Kommentare inA
schlagen vor, es wurde in entwickeltksh
. Ich habe in operiertbash
bisher.
InnerhalbA
, die auszuführende ZeileB
ist einfach:
. B
Es verwendet die "Punktraum" -Syntax, um das Programm aufzurufen. Es macht nichts ungewöhnliches wiesudo
.
Wenn ich anrufeA
ohne Punktraumsyntax, d. h .:
./A
Es kommt immer die Fehlermeldung, dass die Datei nicht gefunden werden kannB
. Ich fügte hinzupwd
, ls
, whoami
, echo $SHELL
, undecho $PATH
Linien zuA
zu debuggen und zu bestätigenB
ist in der Tat genau dort, läuft das Skript mit dem gleichen$SHELL
Da ich an der Eingabeaufforderung bin, ist das Skript derselbe Benutzer wie ich und das Skript hat den gleichen Suchpfad$PATH
wie ich. Ich habe auch Folgendes überprüft:
. B
In der Befehlszeile funktioniert es einwandfrei. Aber wenn ich die Syntax drin ändereA
zu:
./B
stattdessen dannA
wird erfolgreich ausgeführt.
Ebenso, wenn ich ausführeA
mit Punktraumsyntax dann beide. B
und./B
Arbeit.
Zusammenfassend:./A
funktioniert nur wennA
enthält./B
Syntax.. A
funktioniert fürA
mit entweder./B
oder. B
Syntax.
Ich verstehe, dass mit Punktraum (d. H.. A
) Die Syntax wird ausgeführt, ohne auf eine Subshell zu verzichten, aber ich sehe nicht, wie dies zu dem von mir beobachteten Verhalten führen kann, da die Datei eindeutig richtig ist. Fehlt mir etwas an den Nuancen der Syntax oder der übergeordneten / untergeordneten Prozessarbeitsbereiche? Magie?
UPDATE1: Es wurden Informationen hinzugefügt, die darauf hinweisen, dass das Skript möglicherweise in entwickelt wurdeksh
, während ich benutzebash
.
UPDATE2: Überprüfung zur Überprüfung hinzugefügt$PATH
ist dasselbe.
UPDATE3: Das Skript sagt, dass es für geschrieben wurdeksh
, aber es läuft inbash
. Als Antwort auf Kensters Antwort fand ich, dass es läuftbash -posix
dann. B
schlägt in der Befehlszeile fehl. Dies weist darauf hin, dass der Unterschied zwischen der Befehlszeile und dem Skript darin besteht, dass letzteres ausgeführt wirdbash
in einem POSIX-kompatiblen Modus, während dies in der Befehlszeile nicht der Fall ist. Bei näherer Betrachtung sehe ich dies in derbash
man
Seite:
Beim Aufruf als sh wechselt bash in den Posix-Modus, nachdem die Startdateien gelesen wurden.
Dasshebang
zumA
ist in der Tat#!/bin/sh
.
Zusammenfassend, wenn ich renneA
Ohne Punktraumsyntax wird auf eine eigene Subshell verzweigt, die sich im POSIX-kompatiblen Modus befindet, da dieshebang
ist#!/bin/sh
(anstelle von z.B.#!/bin/bash
. Dies ist der entscheidende Unterschied zwischen der Befehlszeilen- und der Skriptlaufzeitumgebung, der dazu führtA
nicht finden könnenB
.