xargsを使用してシェルスクリプトに渡されたコマンドライン引数を使用する方法は?

xargsを使用してシェルスクリプトに渡されたコマンドライン引数を使用する方法は?

一連のgitチェックアウトを繰り返し、各ディレクトリでgitコマンドを実行するスクリプトがあります。

これで、コマンドラインからシェルスクリプトに引数を渡し、その引数を実行中のgitコマンドに統合できるようになります。

私は次のスクリプトをテストとして使用しています(表示されるパラメータが表示されるまでgitコマンドを削除しました)。

#!/usr/bin/env bash
find . -type d -exec test -e '{}/.git' ';' -print -prune | xargs -P 1 -I {} sh -c 'cd {}; echo `pwd` $1; echo ""'

引数を含むコマンドを実行すると、.gitディレクトリと引数を含むディレクトリの名前が表示されることが予想されます。

ディレクトリ名のみを取得します。

多くの努力の終わりにこれで終わりだったのに…

#!/usr/bin/env bash
find . -type d -exec test -e '{}/.git' ';' -print -prune | BRANCH="$1" xargs -P 1 -I {} sh -c 'cd {}; echo `pwd` "${BRANCH}"; echo ""'

私が欠けているメカニックがありますか?主張を伝える「より良い」方法はありますか?

答え1

シェルスクリプト内でインラインスクリプトを使用して別のシェルを呼び出すことができます。このスクリプトを一重引用符で囲み、$1そのまま渡します。起動したばかりの新しいシェルには独自のパラメータセットがありますが、空です。したがって、解析すると$1nullに拡張されます。

操作例では、新しいシェルに表示される新しい変数に値を割り当てます。


すべてのgitリポジトリを見つけるには、all-git以下のスクリプトをコピーすることもできます。使い方は簡単です。 all-git <git command>例えばall-git status -bs

#!/bin/bash

for repo in `find $PWD -type d -name .git`
do
    repo=${repo%.git}
    ( 
        cd $repo
        echo "${repo%/}: " | sed -e "s#$HOME#~#"
        git "$@"
    )
done

答え2

find . -type d -exec test -e '{}/.git' ';' -print -prune | \
    xargs -P $(nproc) -I {} sh -c "cd \"{}\"; echo \"\$(pwd) $1\"; echo "

機能する必要がありますが、エクスポートされた関数を呼び出すこともできます。

OPT="$1"
function doGitWork {
    DIR="$1"
    cd "$DIR"
    echo "$(pwd) $OPT"
}
export -f doGitWork
find . -type d -exec test -e '{}/.git' ';' -print -prune | \
    xargs -P $(nproc) -I {} sh -c "doGitWork \"{}\";"

答え3

GNU Parallelを使用すると、次のようになります。

find . -type d -exec test -e '{}/.git' ';' -print -prune |
    parallel 'cd {}; echo $(pwd) {}; echo'

git pullディレクトリーがあるすべてのディレクトリーで以下を実行するには、次のようにします.git

allgit() {
  find . -type d -name .git | 
      parallel --tagstring {//} "cd {//}; git $@"
}
allgit pull

関連情報