it-swarm.com.de

Wie kann ich in einem Bash-Skript zu einem Verzeichnis wechseln, dessen Name in einer Variablen gespeichert ist?

Ich mache ein FileCreator-Skript:

#!/bin/bash

echo "Welcome to the file creator! Please type the directory name:"
read dirName

mkdir $dirName

#Now I want to change directory to that new $dirName that will be run from Terminal.

Meine Frage ist jetzt, wie man den Pfad zu diesem neuen Verzeichnis dirName ändert, das auf Terminal sichtbar ist. Am Ende sollte der Pfad also sein: /home/my_user_name/SCRIPTS/dirName wenn ich dieses Skript ausführe ...

Bitte, nur ein Vorschlag? :)

3

Der Befehl cd ändert in welchem ​​Verzeichnis Sie sich befinden . Führen Sie help cd aus, um Einzelheiten zu erfahren.

Wenn dirName eine Shell Variable ist, die den Namen des Verzeichnisses enthält, in das Sie wechseln möchten, dann

cd -- "$dirName"

werde dorthin gehen. Wenn Sie beispielsweise mit /home/my_user_name/SCRIPTS beginnen und die Variable dirName den Text foo enthält, führt Sie dieser Befehl zu /home/my_user_name/SCRIPTS/foo.

Wenn Sie möchten, dass dirName immer als relativer Pfad in /home/my_user_name/SCRIPTS interpretiert wird, unabhängig davon, von wo aus der Benutzer Ihr Skript ausführt, verwenden Sie:

cd -- "/home/my_user_name/SCRIPTS/$dirName"

Möglicherweise haben Sie das führende -- Argument und die Verwendung von Anführungszeichen bemerkt:

  • Wenn Sie in einem Skript Benutzereingaben als Argumente an einen Befehl übergeben, der Optionen akzeptiert, beginnend mit - oder --, ist dies normalerweise eine gute Idee pass die -- Option zuerst. Die meisten Befehle, die Dateinamenargumente akzeptieren, unterstützen diese Syntax (Sie sollten dies jedoch immer überprüfen). Dies bedeutet, dass alle nachfolgenden Argumente als Dateinamen und nicht als Optionen interpretiert werden sollen.

    Um dies zu verstehen, führen Sie ls -l und ls -- -l aus. Normalerweise müssen Sie das Argument -- nicht verwenden, wenn Sie Befehle manuell eingeben. In einem Skript, das den Wert einer nicht bereinigten Eingabe an einen Befehl übergibt, wird er jedoch häufig verwendet.

  • In beiden Befehlen habe ich doppelte Anführungszeichen ("") verwendet. Dies ist normalerweise erwünscht, wenn Sie eine Variable erweitern, die einen Dateinamen enthält.

    Wie wenn Sie überhaupt keine Anführungszeichen verwendet haben, aber im Gegensatz zu einfache Anführungszeichen (''), erlauben doppelte Anführungszeichen Parametererweiterung . Sie verhindern also nicht, dass $dirName auf den Wert erweitert wird, der ihm vom Befehl read zugewiesen wurde. Im Gegensatz zur Verwendung von Anführungszeichen verhindern doppelte Anführungszeichen jedoch Wortteilung . Auf diese Weise funktioniert die Variable weiterhin ordnungsgemäß, wenn sie Leerzeichen enthält (oder Zeichen in IFS , wenn dies festgelegt wurde ).

    Siehe auch .1.2 Zitieren im Bash-Referenzhandbuch .

Ich empfehle, in Ihrem mkdir -Befehl auch doppelte Anführungszeichen zu verwenden, und wahrscheinlich auch --:

mkdir -- "$dirName"

Beachten Sie jedoch, dass das Ändern des aktuellen Verzeichnisses in einem Shell-Skript nicht dazu führt, dass der aufrufende Prozess das aktuelle Verzeichnis ist geändert. Dies ist beabsichtigt (und gilt für die meisten, wenn nicht alle Betriebssysteme, einschließlich Windows). Wenn ein Programm ein anderes Programm ausführt, erwartet es nicht, dass sein eigenes aktuelles Verzeichnis geändert wird.

Jedes Programm hat sein eigenes mgebung und sein eigenes aktuelles Verzeichnis. Wenn Sie ein neues Programm starten, übernimmt es dies von dem Programm, mit dem es gestartet wurde, es verfügt jedoch über eine eigene Kopie. Wenn ein ntergeordneter Prozess das aktuelle Verzeichnis ändert, wird dies nicht im übergeordneten Prozess widergespiegelt .

Wenn Sie das Verzeichnis für den Anrufer ändern möchten, ist es oft die richtige Vorgehensweise, Ihr Design zu überdenken. Brauchst du das wirklich

Grundsätzlich ist es nur dann sinnvoll, das Verzeichnis für den Aufrufer zu ändern, wenn Ihr Skript wirklich nur eine Liste von Befehlen ist, die auch direkt vom Aufrufer ausgeführt werden können. Wenn dies der Fall ist, können Sie das Skript als Quelle verwenden, anstatt es auszuführen . Angenommen, Sie führen derzeit Ihr Skript mit dem folgenden Befehl aus:

./my_script

Dann können Sie stattdessen eine Quelle mit:

. ./my_script

Diese alternative Syntax wird ebenfalls unterstützt:

source ./my_script

The Bash Shell unterstützt sowohl den . als auch den sourcebuiltins und sind äquivalent. (Führen Sie help . oder help source aus, um Einzelheiten zu erfahren.)

Dies bewirkt, dass alle Befehle in Ihrem Skript in der aktuellen Shell ausgeführt werden und nicht in einer neuen Shell (was passiert, wenn Sie tatsächlich ausführen ein Shell-Skript).

8
Eliah Kagan