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'하거나 명령을 여러 파일로 분할해야 합니다. 이는 일반적으로 간단한 솔루션입니다. 인용된 문제에.

관련 정보