배쉬 매뉴얼에서
함수 정의 자체가 복합 명령이기 때문에 함수가 실행될 때가 아니라 함수 정의를 읽을 때 별칭이 확장됩니다. 따라서 함수에 정의된 별칭은 함수가 실행된 후에만 사용할 수 있습니다. 안전을 위해 항상 별칭 정의를 별도의 줄에 입력하고복합 명령에 별칭을 사용하지 마세요.
알겠어요함수 정의에 별칭을 사용하면 몇 가지 잠재적인 문제가 있습니다., 아직 몇 가지 질문이 있지만함수 정의를 실행하고 함수를 호출할 때 다음 중 함수 본문 내에서 수행되는 셸 작업은 무엇입니까?.
그런데 왜 "복합 명령에 별칭을 사용하지 마십시오"가 함수 정의에서 일반 복합 명령으로 일반화됩니까?
앨리어싱 문제가 발생할 수 있는 다른 유형의 복합 명령은 무엇입니까?
답변1
그런데 왜 "복합 명령에 별칭을 사용하지 마십시오"가 함수 정의에서 일반 복합 명령으로 일반화됩니까?
정반대입니다 (bash 매뉴얼 발췌문이 불완전합니다). 복합 명령은 복합 명령인 기능 정의로 요약됩니다.
복합 명령은 읽은 후 즉시 실행됩니다. 별칭은 읽기 시간이 아닌 실행 시간에 정의됩니다(분명히). 그러나 별칭 대체는 명령을 읽을 때만 발생합니다.
다음 복합 명령을 예로 들어 보겠습니다.
$ alias echo='echo Follow my advice:' &&
> echo Alias is a basic substitution mechanism
Alias is a basic substitution mechanism
$ echo Use aliases sparingly
Follow my advice: Use aliases sparingly
&&
첫째, 복합 명령의 도입 으로 인해 쉘이 아무 작업도 수행하지 않고 두 번째 줄을 묻는 메시지를 표시하는 것을 볼 수 있습니다 .
이 두 줄 복합 명령이읽다, 명령을 실행하기 전에 별칭을 바꿉니다. 이렇게 바꾸면 echo
별칭이 아직 존재하지 않으므로 아무것도 바뀌지 않습니다. 마지막으로 별칭 정의 뒤에 오더라도 전체 명령이 실행될 때 echo
사용되는 내장 명령 입니다.
echo
두 번째 명령이 다음과 같을 때읽다이면 echo
별칭이 존재하고 대체됩니다. 따라서 실행되는 명령은 입니다 echo Follow my advice: Use aliases sparingly
.
함수 정의는 더 큰 복합 명령이지만 기능은 동일합니다. 모든 내부 별칭 정의는 함수가 호출될 때만 적용됩니다.