Neden bash betiğinde iki cd komutu kullanmak ikinci komutu çalıştırmıyor?


15

Bir dizi dizin oluşturan bir bash betiği yazdım ve seçilen dizinlere bir proje klonladım.

Bunun için, cdher dizine ( project 1ve project 2) ihtiyacım var, ancak komut dosyası cdikinci dizine ne de komutu çalıştırmıyor.

Bunun yerine, dizinde sonra cdve klonlama durur project2. Neden cd_project1aşağıdaki koddaki işlevi çağırmıyor?

#!/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 çıkışı:

~/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$

3
Yanıtlardan birini kabul etmeyi düşünün. Birden fazla cevap bir soru için bir çözümse - en iyiyi kabul edin ve bir diğerini yükseltin.
LeonidMew

1
Merhaba LeonidMew. Üzgünüm cevapları nasıl kabul edeceğime dair hiçbir fikrim yok. Her iki cevap da eşit derecede iyidir.
Jenny

5
@Jenny, acele etmeyin. Oku Birisi soruma cevap verdiğinde ne yapmalıyım? bunun yerine memnun olduğunuzda buna göre hareket edin . Sadece acele etmeyin, acele etmek için bir neden yok. Bir gün içinde veya bir hafta içinde veya ne zaman olursa olsun karar verirseniz mükemmel olur.
PerlDuck

2
@LeonidMew Soru sorulduğundan bu yana neredeyse 45 dakika geçti, daha uzun süre beklemek A-OK, daha iyi bir cevap bile gelebilir (PerlDuck'un yorumu söylediği gibi, yazarken ortaya çıktı)
Xen2050

6
Ne yapmak istediğini merak ediyorum exec bash.
sonraki duyuruya kadar duraklatıldı.

Yanıtlar:


28

Suçlular exec bashbazı işlevlerinizdeki ifadelerinizdir. execİfadesi biraz garip ve kolayca ilk etapta anlaşılamamıştır. Bunun anlamı: şu anda çalışan komut / shell / script yerine şu komutu çalıştırmak . Yani: o yerini bir örneğiyle (sizin durumunuzda) geçerli shell script bashve asla geri döner.

Bunu bir kabuk ve sorunla deneyebilirsiniz

exec sleep 5

Bu işlem geçerli kabuğunuzu (the bash) komutla değiştirir sleep 5 ve bu komut geri döndüğünde (5 saniye sonra) kabuk değiştirildiği için pencereniz kapanır sleep 5.

Senaryonuzla aynı: Eğer senaryonuza koyarsanız exec something, senaryonun yerini alır somethingve bu somethingyürütmeyi durdurduğunda, senaryonun tamamı durur.

Sadece exec bashifadeleri düşürmek gerekir.


2
@Jenny Duymak güzel. Anekdot: Perl dili de execaynı davranışa sahip bir ifadeye sahiptir ve bir ifadeden sonraexec (örneğin exec something; print "This won't run";) bazı ifadeler koyarsanız, Perl printifadenin asla yürütülmeyeceği konusunda sizi uyaracaktır .
PerlDuck

9
BTW, cd'den sonra && kullandığınız için tebrik eder (eğer kullanmazsanız set -e). Kod cd tmp; rm -rf *korkunç başarısız gibi gördüm
eckes

15

Gönderen 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.

Buradaki anahtar kelime değiştirilir - exec bashbir komut dosyasının içinden geçerseniz , başka komut dosyası yürütme gerçekleşemez.


0

başlattığınız dizine dönmek istiyorsanız,

cd -

Ancak bir cdkomutun yürütülüp yürütülmediğinden emin değilseniz, çalışma dizinlerini bir yığına koymak için komutları kullanmak daha iyi olacaktır:

pushd

ve buna geri dön (birden çok dizin değişikliğinden sonra bile)

popd

eşitlik pushdve popdkomutlara sahip olduğunuzdan emin olun .


2
Sorunlu alanı okuduğunuzdan veya anladığınızdan emin değilim. Bu komutların hiçbiri kullanıcıya yardımcı olmaz.
boru

Hiçbir yerde bir kabukta bazı komutları yürütmenin gerekliliğini okuyamam. Bu yüzden başlangıç ​​dizinine geri dönmek için bash'ı aradığını düşündüm. Eğer ısrar ederseniz şunu söyleyebilirsiniz: Kayıp devamın sebebini sordu, bu da diğer cevaplar tarafından mükemmel bir şekilde cevaplandı.
Bernd Wilke πφ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.