这是一个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)
但没有运气
答案 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