Mengapa tidak menggunakan dua perintah cd dalam skrip bash menjalankan perintah kedua?

15

Saya telah menulis skrip bash yang menciptakan serangkaian direktori dan klon proyek ke direktori yang dipilih.

Untuk itu, saya perlu ke cdsetiap direktori ( project 1dan project 2), tetapi skrip tidak cdke direktori kedua atau mengeksekusi perintah.

Sebagai gantinya, itu berhenti setelah cddan kloning di project2direktori. Mengapa tidak memanggil cd_project1fungsi 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$
Jenny
sumber
3
Pertimbangkan menerima salah satu jawaban. Jika lebih dari satu jawaban merupakan solusi untuk sebuah pertanyaan - terima yang terbaik dan pilih yang lain.
LeonidMew
1
Hai Leonidew. Maaf saya tidak tahu bagaimana menerima jawaban. Kedua jawaban sama-sama bagus.
Jenny
5
@ Jenny, jangan merasa tergesa-gesa. Baca Apa yang harus saya lakukan ketika seseorang menjawab pertanyaan saya? sebaliknya dan bertindak sesuai saat Anda puas . Luangkan waktu Anda, tidak ada alasan untuk bergegas. Tidak apa-apa jika Anda memutuskan dalam sehari atau dalam seminggu atau dalam waktu berapa pun.
PerlDuck
2
@LeonidMew hampir 45 menit sejak pertanyaan diajukan, menunggu lebih lama adalah A-OK, jawaban yang lebih baik bahkan mungkin datang (seperti komentar PerlDuck mengatakan, itu hanya muncul saat saya mengetik)
Xen2050
6
Saya ingin tahu apa yang ingin Anda exec bashlakukan.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

28

Penyebabnya adalah exec bashpernyataan Anda dalam beberapa fungsi Anda. The execpernyataan 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 contoh bashdan tidak pernah kembali.

Anda dapat mencoba ini dengan shell dan masalah

exec sleep 5

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 dengan sleep 5.

Sama dengan skrip Anda: Jika Anda memasukkan exec somethingskrip Anda, skrip akan diganti dengan somethingdan ketika itu somethingmenghentikan eksekusi, seluruh skrip berhenti.

Cukup menjatuhkan exec bashpernyataan harus dilakukan.

PerlDuck
sumber
2
@ Jenny Senang mendengarnya. Anekdot: Bahasa Perl juga memiliki execpernyataan dengan perilaku yang sama dan jika Anda menaruh beberapa pernyataan setelahnya sebuah execpernyataan (seperti exec something; print "This won't run";) kemudian Perl akan memperingatkan Anda bahwa printpernyataan tidak akan pernah dijalankan.
PerlDuck
9
BTW selamat menggunakan && setelah cd, (jika Anda tidak menggunakannya set -e ). Saya telah melihat Kode seperti cd tmp; rm -rf *gagal mengerikan
eckes
15

Dari help exec:

exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.

Kata kunci di sini adalah ganti - jika Anda exec bashdari dalam skrip, tidak ada eksekusi skrip lebih lanjut dapat terjadi.

Steeldriver
sumber
0

jika Anda ingin kembali ke direktori yang Anda mulai, Anda bisa menggunakan

cd -

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:

pushd

dan kembali ke sana (bahkan setelah beberapa perubahan direktori)

popd

pastikan untuk memiliki equaly pushddan popdperintah.

Bernd Wilke πφ
sumber
2
Saya tidak yakin Anda membaca atau memahami ruang masalah. Tidak satu pun dari perintah ini akan membantu pengguna.
pipa
Saya tidak bisa membaca perlunya menjalankan beberapa perintah di shell. Jadi saya pikir dia memanggil bash untuk kembali ke direktori awal. Jika Anda bersikeras Anda mungkin mengatakan: ia meminta alasan kelanjutan yang hilang, yang dijawab dengan sempurna oleh jawaban lainnya.
Bernd Wilke πφ