命令执行时没有这样的文件或目录

时间:2021-03-20 17:09:13

标签: bash git function command

我想用 bash 克隆一个 git 存储库。除此之外,我需要执行几个不同的命令,并且都应该使用相同的代码部分进行检查。所以我写了这个方法:

exec_func() {
    print_msg "$1"
    if [ "$(bash "$2" >> log.txt 2>&1;echo $?)" -eq "0" ]; then
            # Task success
    else
            # Task fails
    fi
    printf "\n\n" >> log.txt
}

调用这个函数需要两个参数。第一个参数只是一个字符串,解释执行哪个命令,它只会通过函数 print_msg 输出一些颜色。第二个参数是命令。我可以使用此函数执行另一个 bash 脚本,但使用以下命令失败:

exec_func "Update using gitlab" \
      "git clone https://${git_username}:${git_password}@gitlab.com/*****/${GIT_PROJECT_NAME}.git"

所有需要的变量都设置正确(git_username、git_password、GIT_PROJECT_NAME),如果我将它复制到终端并运行它,该命令将起作用。此外,git 在路径中 - 准确地说:git 位于 /usr/bin/git 中,/usr/bin 位于 $PATH 中。

为什么我会收到此错误?

bash: git clone https://*****:*****@gitlab.com/*****/*****.git: No such file or directory

1 个答案:

答案 0 :(得分:1)

"$(bash "$2" >> log.txt 2>&1;echo $?)" 是错误的,shell 正在尝试执行一个名为

的命令 <块引用>

'git clone https://:@gitlab.com//.git'

(一次所有行)

要么直接执行命令而无需其他子shell(使用 $(...) 已经可以)

"$($2 >> log.txt 2>&1;echo $?)"

要么使用 bash 的 -c 选项来传递命令:

"$(bash -c "$2" >> log.txt 2>&1;echo $?)"