함수 내의 별칭이 작동하지 않는 이유는 무엇입니까? [복사]

함수 내의 별칭이 작동하지 않는 이유는 무엇입니까? [복사]

아래 코드를 참조하세요.

a()(alias x=echo\ hi;type x;alias;x);a

함수 내부에 별칭이 있고 외부 환경을 변경하고 싶지 않습니다(그래서 ()대신 을 사용합니다 {}). 코드에 별칭이 성공적으로 설정되었다고 나와도 작동하지 않습니다. 출력을 확인하세요.

x is aliased to `echo hi'
...
alias x='echo hi'
x: command not found

이것이 효과가 있다고 들었지만 효과가 없을 뿐만 아니라, 그런 작업을 하고 있기 때문에 shopt -s expand_aliases의지할 수 없습니다 .bashdd-wrtbusyboxash

이 문제에 대해 아는 사람이 있나요?

답변1

나는 그것을 사용하지 않지만 설명서에는 별칭에 대해 다음과 같이 나와 dash있습니다 .bash

별칭의 정의 및 사용에 관한 규칙은 다소 혼란스럽습니다. Bash는 해당 줄에서 명령을 실행하기 전에 항상 입력의 전체 줄을 하나 이상 읽습니다.. 별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다. 따라서 다른 명령과 같은 줄에 나타나는 별칭 정의는 다음 입력 줄을 읽을 때까지 적용되지 않습니다. 이 줄의 별칭 정의 뒤에 오는 명령은 새 별칭의 영향을 받지 않습니다.. 이 동작은 함수를 실행할 때도 문제가 됩니다. 함수 정의 자체가 복합 명령이기 때문에 함수가 실행될 때가 아니라 함수 정의를 읽을 때 별칭이 확장됩니다. 따라서 함수에 정의된 별칭은 함수가 실행된 후에만 사용할 수 있습니다. 안전을 위해 항상 별칭 정의를 별도의 줄에 배치하고 복합 명령에 별칭을 사용하지 마십시오.

이번에는 zsh매뉴얼의 또 다른 인용문입니다.

다음 코드는 일반적인 앨리어싱 문제를 보여줍니다.

          alias echobar='echo bar'; echobar

echobar명령을 찾을 수 없다는 메시지가 인쇄됩니다 . 이는 코드를 읽을 때 별칭이 확장되기 때문에 발생합니다.한숨에 전체 줄을 읽으십시오, echobar실행 시 새로 정의된 별칭을 확장하기에는 너무 늦습니다. source이는 일반적으로 다음을 사용하거나 실행하는 쉘 스크립트, 함수 및 코드에서 발생하는 문제입니다. .. 따라서 비대화형 코드에서는 별칭 대신 함수를 사용하는 것이 좋습니다.

다른 쉘에도 비슷한 상황이 존재한다고 확신합니다.

답변2

사용에 반대하지 않는 경우 eval:

$ busybox ash -c 'a()(alias x=echo\ hi;type x;alias;eval x);a'
x is an alias for echo hi
x='echo hi'
hi

이것이 왜 작동하는지 모르겠습니다.

관련 정보