将两个命令合并在一起

Merging two commands together

我目前正在使用以下方法从我的 git 标签中获取最新版本:

git fetch --tags; git tag -l | awk -F'[/]' '{print }' | sort | tail -1 | awk -F. -v OFS=. '{$NF += 1 ; print}'

其中returns一个版本如1.0.0.

然后我使用以下更新版本:

ls *.yml | awk -F'[.]' '{print "/1.0.0"}' | xargs -L 1 -I@ bash -c 'git tag -m @ @'; git push --tags

如何将第一个命令的输出自动传递到第二个命令,这样我就不必手动更改 1.0.0?

我试过:

git tag -l | awk -F'[/]' '{print }' | sort | tail -1 | awk -F. -v OFS=. '{$NF += 1 ; print}' | read version; ls *.yml | awk -F'[.]' '{print "/" $version}' | xargs -L 1 -I@ bash -c 'echo @'

但它没有用(可能是因为分叉?)

| read version 产生一个子 shell 并将 stdin 存储在变量 version 中,但随后管道结束,子 shell 关闭,并且(在子 shell 中进行的)赋值被丢弃;一般问题是子 shell 中的分配没有传递到 calling/parent 进程。

使用 OP 当前代码的一个想法:

version=$(git tag -l | awk -F'[/]' '{print }' | sort | tail -1 | awk -F. -v OFS=. '{$NF += 1 ; print}')

ls *.yml | awk -F'[.]' -v ver="${version}" '{print  "/" ver}' | xargs -L 1 -I@ bash -c 'echo @'

备注:

  • 我假设 OP 的当前代码可以正常工作;这里的 objective 只是为了捕获 top-level 的版本并使其可用于 follow-on awk
  • 可能有更有效的方法来提取和更新版本字符串,但需要查看 get tag-l 的输出和一些 *.yml 文件的示例内容(如果 OP 想进一步调查这个那么应该问一个新问题)

您可以使用命令的结果,使用 $(...),您可以从这个例子中看到:

开始于:

如何进行计算? ($(( ... )) 的用法)

Prompt> echo $((3 * 2))

命令示例,结果为数字:

Prompt> cat Analyse.txt | wc -l
1337

在计算中使用该结果:

Prompt> echo $(($(cat Analyse.txt | wc -l) * 2))
2674

但是:你的获取版本号的命令很复杂,使用那个版本号的命令也很大,所以两者的结合可能会使你的脚本变得非常混乱和难以理解(并且无法维护),所以您可能会选择 mark.

的答案