Makefile bash和xargs变量不起作用

问题描述 投票:0回答:4

这是一个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
[email protected]:xxx/xxx1.git   app-xxx1
[email protected]: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)但没有运气

bash makefile
4个回答
5
投票

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

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

0
投票

使用-I {}读取行并将其用于Makefile中的输入

install:
    -cat projects.txt  | xargs -I '{}' git clone '{}'

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

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 [email protected]:xxx/xxx1.git app-xxx1
git clone [email protected]:xxx/xxx2.git app-xxx2
© www.soinside.com 2019 - 2024. All rights reserved.