특정 별칭이 정의되어 있는지 테스트하는 방법은 무엇입니까?

특정 별칭이 정의되어 있는지 테스트하는 방법은 무엇입니까?

특정 별칭이 정의된 경우 다르게 동작해야 하는 bash 스크립트가 있습니다. bash에서 특정 명령이 별칭인지 테스트하는 방법이 있습니까?

답변1

alias별칭 없이 전달 되면 =value정의된 별칭 정의만 인쇄되고, 이 클래스 이름이 없으면 오류와 함께 실패합니다.

그래서 당신은 이것을 할 수 있습니다 :

if alias your_alias_name >/dev/null 2>&1; then 
  do_something
else 
  do_another_thing; 
fi

( your_alias_name필요에 따라 교체)

답변2

나 그거하고 싶어@jimmij 댓글 5년 전답변을 입력하세요:

type -t이 목적을 위해 설계되었습니다. alias주어진 명령이 별칭이면 출력됩니다. 명령이 존재하지 않으면 아무 것도 출력되지 않습니다. 즉, 표준 오류 또는 기타 항목을 리디렉션할 필요가 없습니다.

예:

if [ "$(type -t foo)" = 'alias' ]; then
    echo 'foo is an alias'
else
    echo 'foo is not an alias'
fi

-t이 스위치는 POSIX에 정의되어 있지 않습니다. Bash 이외의 쉘에서는 이를 구현하지 못할 수 있습니다.

답변3

경고의 말:

셸 기능과 별칭은 셸로 제한되며 셸 스크립트 실행에는 영향을 미치지 않습니다.

발견 중https://askubuntu.com/a/98796, 내 자신의 고통스러운 경험이 이것을 확인시켜줍니다.

다소 짜증나는 점은 문서에 명시적으로 언급되어 있지 않다는 것입니다.Bash 사용자 매뉴얼의 관련 섹션, 유일한 힌트는

Alias ​​확장은 기본적으로 수행됩니다(Aliasing 참조).

이것은 나에게 충분히 직관적이지 않습니다.

즉, 다른 답변에서 언급된 모든 기술은동일한 스크립트에 정의된 별칭을 확인하는 경우에만 작동합니다.(또는 다른 파일의 source스크립트에 -d를 추가합니다 ). 별칭이 스크립트를 호출하는 셸에 정의되어 있는지 여부를 (비대화형) 스크립트에서는 확인할 수 없습니다.

aliastest.sh다음은 문제를 보여주는 작은 스크립트입니다.

#!/usr/bin/env bash

shopt -s expand_aliases

is_alias() {
    if [[ "$(type -t $1)" == "alias" ]]; then
        echo "$1 is an alias"
    else
        echo "Cannot find $1"
    fi
}

# == MAIN ==

if [[ $# -lt 1 ]]; then
    echo "Usage: $0 <command> [ <command> ...]"
    exit 1
fi

for cmd in $@; do
    is_alias $cmd
done

이는 ll명령을 사용하여 셸에 정의된 공통 별칭이 있다고 가정합니다 alias ll='ls -alF'(아마도 이미 가지고 있을 것입니다). 실행해 보면 ./aliastest.sh ll이렇게 나옵니다 Cannot find ll.

하지만 절망하지 마세요.해결책이 있습니다:

Bash에게 스크립트를 "대화식으로" 실행하라고 지시하면 스크립트를 호출한 셸에 정의된 별칭이 "표시"됩니다.

bash -i aliastest.sh ll

이라고 대답할 것이다 ll is an alias.

답변4

이렇게 쓰시면 됩니다

[[ $(type your_alias) == *"alias" ]] && echo "alias defined" || echo "alias undefined"

예:

[[ $(type fd) == *"alias" ]] && echo "fd is an alias" || echo "fd is not an alias"

또 다른 옵션은 다음과 같습니다.

[[ -z $(alias | grep 'll=') ]] && echo "alias not found" || echo "alias found"

관련 정보