Makefile bash和xargs变量不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile bash和xargs变量不起作用相关的知识,希望对你有一定的参考价值。
这是一个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)
但没有运气
答案
make将$0
和$1
解释为make变量并尝试扩展它们。尝试用$
替换$$
...
install:
-cat projects.txt | xargs -n 2 bash -c 'git clone $$0 $$1'
另一答案
使用-I {}
读取行并将其用于Makefile
中的输入
install:
-cat projects.txt | xargs -I '{}' git clone '{}'
另一答案
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
另一答案
当我使用两个$
时为我工作。
$ 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
以上是关于Makefile bash和xargs变量不起作用的主要内容,如果未能解决你的问题,请参考以下文章