Napisałem skrypt bash, który tworzy serię katalogów i klonuje projekt do wybranych katalogów.
W tym celu muszę przejść cd
do każdego katalogu ( project 1
i project 2
), ale skrypt nie przechodzi cd
do drugiego katalogu ani nie wykonuje polecenia.
Zamiast tego zatrzymuje się cd
i klonuje w project2
katalogu. Dlaczego nie wywołuje cd_project1
funkcji w następującym kodzie?
#!/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
Wyjście końcowe:
~/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
Przędzarka
źródło
źródło
exec bash
zrobić.Odpowiedzi:
Sprawcy są twoimi
exec bash
stwierdzeniami w niektórych twoich funkcjach. Toexec
stwierdzenie jest nieco dziwne i przede wszystkim niezrozumiałe. Oznacza to: wykonaj następujące polecenie zamiast aktualnie uruchomionego polecenia / powłoki / skryptu odtąd . To znaczy: zastępuje bieżący skrypt powłoki (w twoim przypadku) instancjąbash
i nigdy nie zwraca.Możesz to wypróbować za pomocą powłoki i problemu
Spowoduje to zastąpienie bieżącej powłoki (the
bash
) poleceniem,sleep 5
a gdy polecenie to powróci (po 5 sekundach), okno zostanie zamknięte, ponieważ powłoka została zastąpionasleep 5
.To samo dotyczy skryptu: jeśli wstawisz
exec something
do skryptu, skrypt zostanie zastąpiony przez,something
a gdy tosomething
przerwie wykonywanie, cały skrypt przestanie działać.Po prostu upuszczenie
exec bash
instrukcji powinno wystarczyć .źródło
exec
oświadczenie o tym samym zachowanie i jeśli umieścić niektóre wypowiedzi po zexec
oświadczeniem (jakexec something; print "This won't run";
), a następnie Perl będzie ostrzegał, żeprint
oświadczenie nigdy nie zostanie wykonany.set -e
). Widziałem Code jakcd tmp; rm -rf *
okropne porażkiOd
help exec
:Kluczowym słowem jest tutaj zamień - jeśli jesteś
exec bash
w skrypcie, dalsze wykonywanie skryptu nie może nastąpić.źródło
jeśli chcesz powrócić do katalogu, który uruchomiłeś, możesz użyć
Ale jeśli nie masz pewności, czy
cd
polecenie zostało w ogóle wykonane, lepiej byłoby użyć poleceń do umieszczenia katalogów roboczych na stosie:i wróć do niego (nawet po wielu zmianach katalogu)
koniecznie mieć równość
pushd
ipopd
polecenia.źródło