我编写了一个 bash 脚本,它创建一系列目录并将项目克隆到选定的目录。
为此,我需要cd
转到每个目录(project 1
和project 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
确保有平等pushd
和popd
命令。