![Ubuntu:在 Makefile 中执行终端输出](https://linux22.com/image/157588/Ubuntu%EF%BC%9A%E5%9C%A8%20Makefile%20%E4%B8%AD%E6%89%A7%E8%A1%8C%E7%BB%88%E7%AB%AF%E8%BE%93%E5%87%BA.png)
我有一个命令可以作为另一个命令的输出。我想在 makefile 脚本中运行此输出。
我可以重现的更简单的命令是
awsecrpush:
VAR=$$( sudo echo "ls -lah" ) | bash -c "sudo -s $$VAR"
我的结果是什么:
- 跑步制作
$ 制作 VAR=$( sudo echo "ls -lah" ) | VAR=$( sudo echo "ls -lah" ) | bash -c“sudo -s $VAR” 回显$VAR {空输出}
- 但跑步LS拉,它按预期工作。这就是我想要的 makefile 内容
$ ls-lah 总计 405 -rw-rw-r-- 1 加里 加里 405 七月 22 10:59 Makefile
这只是为了简化我的问题,因为我有一个复杂的命令要执行。
我需要这种方法只是因为我需要在前面附加 SUDOLS拉
答案1
问题是,通过使用|
,您将在单独的子 shell 中运行两个命令(分配VAR
和sudo
使用它的命令),因此您在一个 shell 中设置变量,同时尝试在另一个 shell 中使用它。
此外,实际上不需要管道,因为您并没有真正将第一个命令的任何输出传递到第二个命令的标准输入(ls
实际上并没有在标准输入上获取任何内容。)
只需替换|
为 a;
就可以让这项工作适合您。 (使用&&
也很好,因为这样它只sudo
在生成变量内容的命令成功时才运行该部分。)
请注意,您需要将两者放在同一行中,因为make
通常会为配方中的每个单独行生成一个 shell。您需要两者在同一个 shell 上运行,否则您将从VAR
一个 shell 进行设置并尝试从另一个 shell 中使用它,这将再次不起作用。
awsecrpush:
VAR=$$( sudo echo "ls -lah" ) && bash -c "sudo -s $$VAR"
另一种可能性是使用 Make 变量。这更加灵活,因为您可能不需要太担心子 shell。
假设你有 GNU make,你可以使用外壳函数运行第一个命令并将其输出保存在 Make 变量中。
awsecrpush:
VAR := $(shell sudo echo "ls -lah")
sudo -s $(VAR)