execdirクエリを使用すると、パイプリダイレクトが早すぎます(引用の問題?)

execdirクエリを使用すると、パイプリダイレクトが早すぎます(引用の問題?)

職場で複数のGitHubアカウントを使用しているため、職場アカウントを追加するにはリモートURLを編集する必要があります。 find -execdirと/sed/setリモートURLを再帰的に取得する方法を見つけましたが、それを組み合わせることはできません。

git stを使ってfindコマンドをテストしましたが、うまくいきます。

find . -type d -name ".git" -execdir zsh -c "git st" \;

git setプロセスをテストしましたが、うまくいきます。

git remote set-url origin $(git remote get-url origin | sed 's|https://github|https://my_work_username@github|g')" \

それらを組み合わせるとうまくいきません。

find . -type d -name ".git" -execdir zsh -c "git remote set-url origin $(git remote get-url origin | sed 's|https://github|https://my_work_username@github|g')" \;

最初は.gitフォルダがなく、複数のgit構文エラーがあるというエラーが発生しました。

致命的:gitリポジトリ(または親ディレクトリ)ではありません:.git使用法:gitリモートset-url [--push] []または:gitリモートset-url --addまたは:gitリモートset-url --remove

エコーを追加すると、私が実行するgitコマンドは次のようになります。

git remote set-url origin

パラメータなし

この問題を解決するためのアイデアがないか、用語を検索しています。

ベストアンサー1

find . ... -execdir zsh -c "git remote get-url origin $(git ...)" \;
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ここで、コマンド置換は二重引用符で囲まれた文字列内にあるため、デフォルトのシェルで拡張されます。今後ランニングを探してください。その後、無効なディレクトリで実行され、エラーが発生します。set -xコマンドを有効にして実行すると、zsh -cコマンドラインに定数文字列が表示されるはずです。

このように:

$ set -x
$ find . -type d -execdir bash -c "echo $RANDOM" \;
+ find . -type d -execdir bash -c 'echo 22924' ';'
22924
22924
...

内部シェルがそれを表示して処理を開始できるように、単一引用符を使用して拡張を保護する必要があります。

$ find . -type d -execdir bash -c 'echo $RANDOM' \;
+ find . -type d -execdir bash -c 'echo $RANDOM' ';'
4397
21235
...

sedコマンドには一重引用符の中にあるべき内容は含まれていないので、基本的にここで一重引用符と二重引用符を反転できると思います。

find . -type d -name ".git" -execdir \
   zsh -c 'git remote set-url origin "$(
               git remote get-url origin | 
               sed "s|https://github|https://my_work_username@github|g"
           )"' \;

(完全性のために、コマンドの置き換えの周りに二重引用符を入れて、内部シェルコマンド内で単語を分割しないでください。ここのURLにスペースやワイルドカードを含めることはできませんが、これは良い習慣です。)

sedコマンドにこのようなものがあり、$一重引用符で囲まれた文字列に一重引用符を入れる必要がある場合は、たとえば、より醜いエスケープを実行するか、'it isn'\''t so'コマンドを複数のファイルに分割する必要があります。これは通常簡単な解決策です。引用された問題に。

おすすめ記事