Ubuntu – Why doesn’t using two cd commands in bash script execute the second command

bashcd-commandscripts

I have written a bash script which creates a series of directories and clones a project to selected directories.

For that, I need to cd to each directory (project 1 and project 2), but the script doesn't cd to the second directory nor executes the command.

Instead, it stops after cd and cloning in theproject2 directory. Why doesn't it call the cd_project1 function in the following code?

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

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

Best Answer

The culprits are your exec bash statements in some of your functions. The exec statement is a bit weird and not easily understood in the first place. It means: execute the following command instead of the currently running command/shell/script from here on. That is: it replaces the current shell script (in your case) with an instance of bash and it never returns.

You can try this out with a shell and issue

exec sleep 5

This will replace your current shell (the bash) with the command sleep 5 and when that command returns (after 5 seconds) your window will close because the shell has been replaced with sleep 5.

Same with your script: If you put exec something into your script, the script gets replaced with something and when that something stops execution, the whole script stops.

Simply dropping the exec bash statements should do.