Saya telah menulis skrip bash yang menciptakan serangkaian direktori dan klon proyek ke direktori yang dipilih.
Untuk itu, saya perlu ke cd
setiap direktori ( project 1
dan project 2
), tetapi skrip tidak cd
ke direktori kedua atau mengeksekusi perintah.
Sebagai gantinya, itu berhenti setelah cd
dan kloning di project2
direktori. Mengapa tidak memanggil cd_project1
fungsi dalam kode berikut?
#!/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
Output terminal:
~/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
sumber
sumber
exec bash
lakukan.Jawaban:
Penyebabnya adalah
exec bash
pernyataan Anda dalam beberapa fungsi Anda. Theexec
pernyataan agak aneh dan tidak mudah dipahami di tempat pertama. Ini berarti: jalankan perintah berikut daripada perintah / shell / skrip yang sedang berjalan dari sini . Yaitu: itu menggantikan skrip shell saat ini (dalam kasus Anda) dengan contohbash
dan tidak pernah kembali.Anda dapat mencoba ini dengan shell dan masalah
Ini akan mengganti shell Anda saat ini (dengan
bash
)sleep 5
dan ketika perintah itu kembali (setelah 5 detik) jendela Anda akan ditutup karena shell telah diganti dengansleep 5
.Sama dengan skrip Anda: Jika Anda memasukkan
exec something
skrip Anda, skrip akan diganti dengansomething
dan ketika itusomething
menghentikan eksekusi, seluruh skrip berhenti.Cukup menjatuhkan
exec bash
pernyataan harus dilakukan.sumber
exec
pernyataan dengan perilaku yang sama dan jika Anda menaruh beberapa pernyataan setelahnya sebuahexec
pernyataan (sepertiexec something; print "This won't run";
) kemudian Perl akan memperingatkan Anda bahwaprint
pernyataan tidak akan pernah dijalankan.set -e
). Saya telah melihat Kode seperticd tmp; rm -rf *
gagal mengerikanDari
help exec
:Kata kunci di sini adalah ganti - jika Anda
exec bash
dari dalam skrip, tidak ada eksekusi skrip lebih lanjut dapat terjadi.sumber
jika Anda ingin kembali ke direktori yang Anda mulai, Anda bisa menggunakan
Tetapi jika Anda tidak yakin apakah a
cd
perintah dieksekusi sama sekali, akan lebih baik menggunakan perintah untuk menempatkan direktori yang berfungsi ke dalam tumpukan:dan kembali ke sana (bahkan setelah beberapa perubahan direktori)
pastikan untuk memiliki equaly
pushd
danpopd
perintah.sumber