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 aufbashjedoch 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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage