bashrc에서 별칭을 사용할 때 충돌 가능성을 테스트하는 방법은 무엇입니까?

bashrc에서 별칭을 사용할 때 충돌 가능성을 테스트하는 방법은 무엇입니까?

별명이 지정된 명령과 관련된 bashrc 업데이트로 인해 발생하는 시스템의 모든 명령 충돌을 나열하는 쉬운 방법이 있습니까?

예를 들어 누군가 alias ls=/path/to/user-generated/executablebashrc에 글을 씁니다. 이를 알아내는 방법은 실제 명령( ls)을 마스킹하는 것입니다. 한 가지 접근 방식은 bashrc를 가져오기 전후에 모든 별칭을 실행하고 출력을 비교하는 것 같습니다. 더 좋은 방법이 있나요?

저는 우분투 12.04를 실행하고 있습니다.

배쉬 --버전

GNU bash, 버전 4.2.24(1)-릴리스(i686-pc-linux-gnu)

답변1

bash가 명령을 해석하는 방법을 이해하는 데 사용할 수 있습니다 type.

답변2

별칭으로 인해 차단된 명령을 확인하려면 다음을 수행하세요.

alias                            |
awk -F '[ =]+' '{print $2}'      |
while read cmd; do
  type -ta "$cmd" | grep -q file \
    && printf "%s is overloaded: \"%s\"\n" "$cmd" "$(alias $cmd)"
done

설명하다

alias정의된 별칭을 개별적으로 나열하고 awk해당 이름을 추출합니다. while 루프는 type -ta각 항목을 실행하고 grep하나도 맞는지 확인합니다 file.

답변3

첫 번째 질문으로 bash는 내부적으로 해시 테이블을 사용하고 마지막 재정의만 기록하기 때문에 충돌을 나열할 방법이 없습니다.

명령이 별칭인지 확인하려면 alias ls"찾을 수 없음"과 같은 메시지가 표시되면 별칭이 아니고 그렇지 않으면 별칭입니다.

별칭에 관계없이 원래 기능을 시작하려면 슬래시를 앞에 두십시오. 예를 들어 \lsls는 별칭을 무시하고 실제 해시를 시작합니다.

편집하다

명령이 별칭인지 빨리 알고 싶다면 set -x다음을 실행하여 디버그 모드를 활성화하면 됩니다 ls.

여기에 이미지 설명을 입력하세요.

실행 중인 실제 명령의 디버그 출력을 볼 수 있습니다.

디버깅 모드를 설정 해제하려면 다음을 사용하세요.set -

답변4

bash 내장 명령을 사용하여 compgen모든 명령 및 모든 별칭 목록을 얻을 수 있습니다 compgen -ac. 별칭이기도 한 모든 명령은 이 목록에 중복되므로 간단한 해결 방법은 의 출력에서 ​​중복 항목을 찾는 것입니다 compgen -ac.

그러나 명령이 경로에 두 번 나타나면 중복이 발생할 수도 있습니다. 예를 들어 별칭이 아니더라도 두 번 나열 하겠습니다 /bin/which./usr/bin/whichcompgen -acwhich

따라서 필요한 것은 그것으로부터 모든 중복 항목을 가져와서 compgen -ac별칭 목록과 비교하는 것입니다. 별칭이기도 한 중복 항목만 숨겨진 명령의 별칭입니다. comm(1)명령과 bash 프로세스 대체를 사용하여 이를 수행 할 수 있습니다 .

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sort모든 별칭 목록입니다(정렬됨 comm). compgen -ac | sort | uniq -d명령 및 별칭 목록의 모든 중복 목록입니다. comm -12둘 다에 공통적인 라인만 출력합니다.

관련 정보