bashスクリプトで2つのcdコマンドを使用して2番目のコマンドを実行しないのはなぜですか?


15

一連のディレクトリを作成し、選択したディレクトリにプロジェクトを複製するbashスクリプトを作成しました。

そのためには、cd各ディレクトリ(project 1およびproject 2)にアクセスする必要がありますが、スクリプトはcd2番目のディレクトリにもコマンドを実行しません。

代わりcdに、project2ディレクトリでのクローン作成後に停止します。なぜcd_project1次のコードの関数を呼び出さないのですか?

#!/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

ターミナル出力:

~/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
回答の1つを受け入れることを検討してください。複数の回答が質問の解決策である場合-最良の回答を受け入れ、別の回答に投票してください。
LeonidMew

1
こんにちはLeonidMew。申し訳ありませんが、回答を受け入れる方法がわかりません。どちらの答えも同様に良いです。
ジェニー

5
@ジェニー、急がないでください。誰かが私の質問に答えたらどうしたらいいですか?を読んでください代わりに、満足したらそれに応じて行動します。ただ時間をかけてください、急ぐ必要はありません。1日でも1週間でも、どんな時間でも決めても大丈夫です。
PerlDuck

2
質問は頼まれたので、それはかろうじて45分となっています@LeonidMew、長く待ってA-OKは、より良い答えが偶数(PerlDuckさんのコメントが言うように、私はタイピングあったが、それは単にポップアップ)に沿って来るかもしれない
Xen2050

6
あなたが何をするつもりなのか興味exec bashがあります。
追って通知があるまで一時停止します。

回答:


28

犯人はexec bashあなたの機能の一部であなたの声明です。exec声明は少し奇妙な、簡単に最初の場所で理解されていません。つまり、現在実行中のコマンド/シェル/スクリプトの代わりに、ここから次のコマンドを実行します。つまり、現在のシェルスクリプト(の場合)をのインスタンスに置き換えbash戻りません。

これをシェルと問題で試してみることができます

exec sleep 5

これにより、現在のシェル(bash)がコマンドにsleep 5 置き換えられ、そのコマンドが(5秒後に)戻ると、シェルがに置き換えられたためウィンドウが閉じますsleep 5

スクリプトと同じ:exec somethingスクリプトに入力すると、スクリプトは置き換えられ、実行somethingsomething停止するとスクリプト全体が停止します。

exec bashステートメントをドロップするだけで実行できます。


2
@ジェニー聞いてうれしい。逸話:Perl言語も持ってexec同じ動作で文を、あなたはいくつかのステートメントを置けばexec(のような文exec something; print "This won't run";)その後、Perlがいることを警告しますprint文が実行されない飽きないだろう。
PerlDuck

9
ちなみに、cdの後に&&を使用することを祝福します(使用しない場合set -e)。以下のように私はコードを見てきましたcd tmp; rm -rf *恐ろしい失敗
eckes

15

から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.

ここでのキーワードは置換です - exec bashスクリプト内からの場合、それ以上スクリプトを実行することはできません。


0

開始したディレクトリに戻りたい場合は、使用できます

cd -

ただし、cdコマンドがまったく実行されたかどうかわからない場合は、コマンドを使用して作業ディレクトリをスタックに配置することをお勧めします。

pushd

それに戻る(複数のディレクトリを変更した後でも)

popd

平等pushdpopdコマンドがあることを確認してください。


2
問題空間を読んだり理解したりしたかどうかはわかりません。これらのコマンドはどれもユーザーを助けません。
パイプ

シェルでいくつかのコマンドを実行する必要性はどこにも読めません。だから私は彼がbashを呼び出してスタートディレクトリに戻ると思った。あなたが主張する場合、あなたは言うかもしれません:彼は他の答えによって完全に答えられる行方不明の理由を尋ねました。
ベルントウィルケπφ19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.