Ich habe ein Bash-Skript geschrieben, das eine Reihe von Verzeichnissen erstellt und ein Projekt in ausgewählte Verzeichnisse klont.
Dafür muss ich cd
in jedes Verzeichnis ( project 1
und project 2
), aber das Skript nicht cd
in das zweite Verzeichnis oder führt den Befehl aus.
Stattdessen stoppt es nach dem cd
Klonen im project2
Verzeichnis. Warum wird die cd_project1
Funktion im folgenden Code nicht aufgerufen ?
#!/bin/bash
#Get the current user name
function my_user_name() {
current_user=$USER
echo " Current user is $current_user"
}
#Creating useful directories
function create_useful_directories() {
if [[ ! -d "$scratch" ]]; then
echo "creating relevant directory"
mkdir -p /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2
else
echo "scratch directory already exists"
:
fi
}
#Going to project2 and cloning
function cd_project2() {
cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2 &&
git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
exec bash
}
#Going to project1 directory and cloning
function cd_project1() {
cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/ &&
git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
exec bash
}
#Running the functions
function main() {
my_user_name
create_useful_directories
cd_project2
cd_project1
}
main
Terminal Ausgang:
~/Downloads$. ./bash_install_script.sh
Current user is mihi
creating relevant directory
Cloning into 'documentation-tests'...
remote: Counting objects: 125, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 125 (delta 59), reused 0 (delta 0)
Receiving objects: 100% (125/125), 33.61 KiB | 362.00 KiB/s, done.
Resolving deltas: 100% (59/59), done.
~/Downloads/scratch/mihi/project1/project2$
bash
scripts
cd-command
Jenny
quelle
quelle
exec bash
damit vorhast.Antworten:
Die Schuldigen sind Ihre
exec bash
Aussagen in einigen Ihrer Funktionen. Dieexec
Aussage ist etwas seltsam und überhaupt nicht leicht zu verstehen. Das bedeutet: Führen Sie den folgenden Befehl anstelle des aktuell ausgeführten Befehls / shell / script aus . Das heißt: Es ersetzt das aktuelle Shell-Skript (in Ihrem Fall) durch eine Instanz vonbash
und wird nie zurückgegeben.Sie können dies mit einer Shell und Ausgabe ausprobieren
Dadurch wird Ihre aktuelle Shell (die
bash
) durch den Befehl ersetzt,sleep 5
und wenn dieser Befehl zurückgegeben wird (nach 5 Sekunden), wird Ihr Fenster geschlossen, da die Shell durch ersetzt wurdesleep 5
.Dasselbe gilt für Ihr Skript: Wenn Sie es
exec something
in Ihr Skript einfügen, wird es durch ersetzt,something
und wenn diesomething
Ausführung beendet wird, wird das gesamte Skript angehalten.Einfach die
exec bash
Anweisungen fallen zu lassen sollte genügen.quelle
exec
Anweisung mit dem gleichen Verhalten. Wenn Sie nach einerexec
Anweisung (wieexec something; print "This won't run";
) einige Anweisungen einfügen, warnt Perl Sie, dass dieprint
Anweisung niemals ausgeführt wird.set -e
). Ich habe gesehen, Code wiecd tmp; rm -rf *
schrecklich scheiternVon
help exec
:Das Schlüsselwort ist " Ersetzen". Wenn Sie sich
exec bash
innerhalb eines Skripts befinden, kann keine weitere Skriptausführung erfolgen.quelle
Wenn Sie zu dem Verzeichnis zurückkehren möchten, das Sie gestartet haben, können Sie es verwenden
Wenn Sie jedoch nicht sicher sind, ob ein
cd
Befehl überhaupt ausgeführt wurde, sollten Sie die Befehle verwenden, um Arbeitsverzeichnisse auf einem Stapel abzulegen:und zurückkehren (auch nach mehreren Verzeichniswechseln)
Stellen Sie sicher, dass Sie Gleichheit
pushd
undpopd
Befehle haben.quelle