为什么在 bash 脚本中使用两个 cd 命令不会执行第二个命令?

为什么在 bash 脚本中使用两个 cd 命令不会执行第二个命令?

我编写了一个 bash 脚本,它创建一系列目录并将项目克隆到选定的目录。

为此,我需要cd转到每个目录(project 1project 2),但脚本不会cd转到第二个目录也不会执行命令。

相反,它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://[email protected]/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://[email protected]/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$

答案1

罪魁祸首是你exec bash某些函数中的语句。该exec语句有点奇怪,一开始就不容易理解。它的意思是:执行以下命令反而从现在开始当前正在运行的命令/shell/脚本。 这就对了取代当前 shell 脚本(在您的情况下)有一个实例,bash并且它永远不会返回。

你可以用 shell 尝试一下并发出

exec sleep 5

这会将您当前的 shell(bash)替换为 命令sleep 5 ,并且当该命令返回时(5 秒后),您的窗口将关闭,因为 shell 已被 替换为sleep 5

与您的脚本相同:如果您将exec something其放入脚本中,则脚本将被替换,something并且当something停止执行时,整个脚本就会停止。

只要删除这些exec bash语句就可以了。

答案2

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来自脚本内部,则无法进一步执行脚本。

答案3

如果你想返回到你开始的目录,你可以使用

cd -

但是如果你不确定某个cd命令是否被执行,最好使用将工作目录放入堆栈的命令:

pushd

并返回到该目录(即使经过多次目录更改)

popd

确保有平等pushdpopd命令。

相关内容