Makefile bash& xargs变量不起作用

时间:2018-03-01 15:58:31

标签: bash makefile

这是一个Makefile

roman@debian ~/D/O/devops> cat Makefile 
install:
        -cat projects.txt  | xargs -n 2 bash -c 'git clone $0 $1'

这里是projects.txt

roman@debian ~/D/O/devops> cat projects.txt
git@github.com:xxx/xxx1.git   app-xxx1
git@github.com:xxx/xxx2.git   app-xxx2

在我将这个命令复制到bash时会发生什么 - 它可以工作:

roman@debian ~/D/O/devops> cat projects.txt  | xargs -n 2 bash -c 'git clone $0 $1'

fatal: destination path 'app-xxx1' already exists and is not an empty directory.

它正确地使用git clone它只是存在repo。

现在当你执行make install失败时,所有变量都是空白的:

roman@debian ~/D/O/devops> make install 
cat projects.txt  | xargs -n 2 bash -c 'git clone  '
You must specify a repository to clone.

我想在这里只使用xargs方法,否则它变得过于冗长,使用循环时还会遇到更多问题。我也试过使用$(1)但没有运气

4 个答案:

答案 0 :(得分:5)

make将$0$1解释为make变量并尝试展开它们。尝试将$替换为$$ ...

install:
        -cat projects.txt  | xargs -n 2 bash -c 'git clone $$0 $$1'

答案 1 :(得分:0)

使用-I {}读取行并将其用于Makefile

中的输入
install:
    -cat projects.txt  | xargs -I '{}' git clone '{}'

答案 2 :(得分:0)

make将美元符号引用扩展为自己的变量。虽然通常会写$(name),但可以写$c c是单个字符(只要它不是$),所以当你在命令行中使用$0$1,它们将替换为make内的变量所具有的值。 (make对bash引用一无所知,因此$ -references将在该行的任何位置展开。)

由于make不会自动定义$0$1,并且您不太可能在makefile中定义它们,因此最有可能的是它们将被替换为空字符串,导致您观察到的错误。为了避免这个问题,可以通过加倍来逃避美元符号:

-cat projects.txt  | xargs -n 2 bash -c 'git clone $$0 $$1'

话虽如此,我还不清楚你为什么要在这里使用bash -c

有什么问题
xargs -n2 git clone < projects.txt

答案 3 :(得分:0)

当我使用两个$时为我工作。

$ cat Makefile
install:
    cat projects.txt | xargs -n 2 bash -c 'echo git clone $$0 $$1'
$ make install
cat projects.txt | xargs -n 2 bash -c 'echo git clone $0 $1'
git clone git@github.com:xxx/xxx1.git app-xxx1
git clone git@github.com:xxx/xxx2.git app-xxx2