cygwin bash의 별칭이 올바른 순서로 실행되지 않는 것 같습니다.

cygwin bash의 별칭이 올바른 순서로 실행되지 않는 것 같습니다.

현재 있는 Mercurial 관리 디렉토리에 미해결 변경 사항이 있는지 확인하기 위해 Cygwin 셸에서 사용할 별칭을 만들려고 합니다. "hg st -m" 명령은 수정된 모든 파일을 나열합니다. 안타깝게도 변경 여부에 따라 종료 값을 설정하지 않습니다. 그래서 출력을 캡처해서 비어 있지 않은지 확인하고 "wc -l"을 통해 파이핑해서 -gt 0인지 확인해 보았는데, 그 라인이 분명히 내가 원하는 대로 되지 않기 때문에 더 큰 문제가 있는 것 같습니다. 실행에서는 그렇게 하기를 기대합니다.

이것이 내가 요약한 것입니다:

alias hgfoo='
pwd
echo L1
localChanges="NOT SET YET"
hasLocal="NOT SET YET"
echo "Before: A${localChanges}Z A${hasLocal}Z"
localChanges=`hg st -m`
echo L2
echo "localChanges: A${localChanges}Z"
echo L3
if [ -n "${localChanges}" ] ; then
    echo L3
    hasLocal="YES"
else
    echo L4
    hasLocal="NO"
fi
echo L5
echo "RESULTS: A${hasLocal}Z"
echo L6
'

디버깅을 위해 "Ln" 에코 문을 넣었습니다. 변경이 발생한 디렉터리에 "hgfoo"를 입력하여 실행하면 다음 출력이 표시됩니다.

/d/hg/succession > hgfoo
/d/hg/succession
L1
Before: ANOT SET YETZ ANOT SET YETZ
L2
localChanges: AL2
localChanges: ANOT SET YETZ
L3
L3
L5
RESULTS: AYESZ
L6
M succession-lib\.actionScriptProperties
M succession-lib\src\main\flex\com\workscape\SuccessionConstants.as
M succession-lib\src\main\flex\com\workscape\succession\nomination\tabmodules\BenchStrengthTab.mxml
M succession-lib\src\main\flex\com\workscape\succession\nomination\tabmodules\BenchStrengthTabMediator.as
M succession-lib\src\main\flex\com\workscape\succession\puremvc\controller\StartupSuccession.asZ
L3
L3
L5
RESULTS: AYESZ
L6

변경하지 않고 디렉토리에서 실행하면 다음이 표시됩니다.

/d/hg/employee-profile > hgfoo
/d/hg/employee-profile
L1
Before: ANOT SET YETZ ANOT SET YETZ
L2
localChanges: AL2
localChanges: ANOT SET YETZ
L3
L3
L5
RESULTS: AYESZ
L6Z
L3
L3
L5
RESULTS: AYESZ
L6

비교가 제대로 작동하지 않는다는 사실을 잊어버리더라도 두 경우 모두 잘못된 위치에서 여러 번 줄을 실행하는 것 같습니다. 이것이 나를 미치게 만든다.

어떤 단서가 있나요? 감사해요.

답변1

이것은 bash 별칭 확장의 오래된 버그입니다. bash 3.2.29(1)이 있는 Debian lenny amd64, 4.1.5(1)이 있는 Debian squeeze i386, bash 4.1.9(3)이 있는 Cygwin 1.7.7-1에서 Windows XP를 실행할 수 있습니다.

일부 실험에서는 버그가 별칭 사용 방식의 변경에 매우 민감한 것으로 나타났습니다. hgfoo또는 hgfoo :오류가 표시되지만 정상적으로 { hgfoo :; }작동합니다 (hgfoo). 별칭 대신 함수를 사용하는 것도 가능합니다.

나는 그것을 조사하고 더 작은 예를 추출하려고 노력했습니다. 이상한 점은 별칭의 개행 문자에서 비롯된 것 같습니다. 이것은 bash(3.2.29 또는 4.1.9)의 오작동에 대한 간단한 예입니다. 이 별칭은 Debian lenny의 pdksh, ksh93, ash 및 zsh에서 예상대로 작동합니다(Single Unix v3에 대해 읽음). 즉, oopsprints foo bar.

$ alias oops='a=$(echo bar)
> echo foo $a'
$ oops
foo foo echo bar

이 오류는 다음과 관련이 있을 수 있습니다."이상한 지연 별칭" 관련 버그가 보고되었습니다., 그러나 논의의 초점은 줄 연속(백슬래시 개행)이며 여기서는 사용되지 않습니다.


꼭 기능을 활용해보세요! 별칭은 한 줄의 코드에서 작동하며 명령에 대한 몇 가지 기본 옵션을 지정하기만 하면 됩니다. 함수에는 인수를 전달할 수 있다는 추가 이점이 있습니다 hg.

hgfoo () {
  localChanges=$(hg st -m "$@")
}

1저는 처음에 이것이 Cygwin 버그인 줄 알았습니다.AK2이 오류는 Linux에서도 발생한다는 점을 지적하세요.

답변2

나는 그것을 작동시켰다. 실제로 문제를 일으킨 것은 백틱이었습니다. 나는 그것을 리팩토링했다.

hg st -m | grep -q M

그런 다음 grep의 종료 값을 확인했는데 제대로 작동했습니다.

관련 정보