如何使用另一个命令输出作为终端中文本的一部分来运行命令?

如何使用另一个命令输出作为终端中文本的一部分来运行命令?

如果command1是:

curl -k -v -u user:password https://example.com/v2/image/manifests/tag -H Accept: application/vnd.docker.distribution.manifest.v2+json 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}' 

例如,其输出如下Docker-Content-Digest

> sha256:12345...

知道单独运行每个命令是有效的,如何注入command1输出作为command2文本为:

curl -k -v -u user:password -X DELETE https://example.com/v2/image/manifests/(command1 output)

我只是想只运行一个命令!


更新:

当我使用双引号将它们组合在一起时,如下所示:

curl -k -v -u user:password -X DELETE https://example.com/v2/image/manifests/"$(curl -k -v -u user:password https://example.com/v2/image/manifests/tag -H Accept: application/vnd.docker.distribution.manifest.v2+json 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}')"

我得到以下输出command2从未执行:

> * Illegal characters found in URL
> * Closing connection -1 
> * curl: (3) Illegal characters found in URL

更新2

当我使用单引号时,我得到以下输出:

> < HTTP/1.1 404 Not Found 
< Server: nginx/1.21.3 
< Date: Tue, 28 Sep
> 2021 13:46:50 GMT 
< Content-Type: text/plain; charset=utf-8 <
> Content-Length: 19 
< Connection: keep-alive <
> Docker-Distribution-Api-Version: registry/2.0 <
> X-Content-Type-Options: nosniff < 404 page not found

答案1

我假设你的意思是:

echo "thisis $(echo 'test')"

根据您实际想要实现的目标,您可以尝试很多事情:

  1. 您可以替换命令管道的每个部分并查看错误在哪里。到目前为止,据我所知,您还没有进行任何实际的调试。

  2. 您可以简单地将第一个命令的输出分配给一个变量:

CMD1=$(curl -k -v -u user:password https://example.com/v2/image/manifests/tag -H Accept: application/vnd.docker.distribution.manifest.v2+json 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}')
curl -k -v -u user:password -X DELETE https://example.com/v2/image/manifests/"$CMD1"

显然我无法调试其中任何一个,因为我无权访问任一命令的实际结果集 - 这是为了让您尝试进一步调试。

在任何情况下,$(…)语法称为命令替换,并且在支持它的 shell 的手册页中对此进行了解释(几乎是每一个现代的 shell)。

相关内容