从Windows运行bash多行命令

时间:2018-10-22 14:41:14

标签: bash shell cygwin

我想运行以下命令(取自here):

git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

我必须从Windows命令提示符处运行此命令,但不确定如何使用多行传递它。我尝试将所有内容作为一个命令传递,例如:

bash -c "git for-each-ref ... while read ref.... done

使用多个参数:

bash -c "git for-for-each..." "cut -d..." "while read ref"

如何将多行内容传递给bash?

谢谢

1 个答案:

答案 0 :(得分:0)

最简单的操作(在解析此命令时无需介入每个换行符的作用)是将换行符作为参数的一部分简单地传递:

bash -c 'git for-each-ref --format="%(refname)" refs/heads/tags |
  cut -d / -f 4 |
  while read ref
  do
    git tag "$ref" "refs/heads/tags/$ref";
    git branch -D "tags/$ref";
  done
'

也就是说,唯一的“重要”换行符是do关键字之前的换行符,也可以用分号代替。

bash -c 'git for-each-ref --format="%(refname)" refs/heads/tags | cut -d / -f 4 | while read ref; do git tag "$ref" "refs/heads/tags/$ref"; git branch -D "tags/$ref"; done'

(滚动以查看整个命令。请注意,在多行版本中,最初的两个分号是可选的,但在单行版本中是必需的,以便在循环体中终止每个命令。)

但是,仅循环本身需要由bash的新实例执行;您也可以写类似

git for-each-ref --format="%(refname)" refs/heads/tags |
  cut -d / -f 4 |
  bash -c 'while read ref
           do
             git tag "$ref" "refs/heads/tags/$ref";
             git branch -D "tags/$ref";
           done
           '