Bash의 if...fi에서 별칭 확장이 작동하도록 하는 방법이 있습니까?

Bash의 if...fi에서 별칭 확장이 작동하도록 하는 방법이 있습니까?

다음 스크립트를 확인하세요.

#!/bin/bash
if true;then
    alias WeirdTest='uptime';shopt -s expand_aliases
    WeirdTest
fi
WeirdTest

처음 WeirdTest실행하면 "명령을 찾을 수 없습니다"라고 표시됩니다.

답변1

이는 bash의 한계입니다. 매뉴얼 인용 :

별칭의 정의 및 사용에 관한 규칙은 다소 혼란스럽습니다.

Bash는 명령을 읽을 때 별칭을 확장합니다. 이러한 의미에서 명령은 if … fi완전한 명령(전체 블록은 복합 명령임)과 완전한 줄(따라서 … fi; WeirdTest줄 바꿈을 추가하는 대신 그 뒤에 쓰면 fi두 번째 발생 WierdTest도 확장되지 않음)로 구성됩니다. 스크립트에서 if명령을 읽을 때 WeirdTest별칭은 아직 존재하지 않습니다.

가능한 해결책은 함수를 정의하는 것입니다.

if …; then
  WeirdTest () { uptime; }
  WeirdTest
fi
WeirdTest

동일한 이름의 외부 명령을 호출할 수 있도록 별칭을 사용하려면 command함수 앞에 추가하면 됩니다.

WeirdTest () { command WeirdTest --extra-option "$@"; }

관련 정보