별명이 지정된 명령과 관련된 bashrc 업데이트로 인해 발생하는 시스템의 모든 명령 충돌을 나열하는 쉬운 방법이 있습니까?
예를 들어 누군가 alias ls=/path/to/user-generated/executable
bashrc에 글을 씁니다. 이를 알아내는 방법은 실제 명령( 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
"찾을 수 없음"과 같은 메시지가 표시되면 별칭이 아니고 그렇지 않으면 별칭입니다.
별칭에 관계없이 원래 기능을 시작하려면 슬래시를 앞에 두십시오. 예를 들어 \ls
ls는 별칭을 무시하고 실제 해시를 시작합니다.
편집하다
명령이 별칭인지 빨리 알고 싶다면 set -x
다음을 실행하여 디버그 모드를 활성화하면 됩니다 ls
.
실행 중인 실제 명령의 디버그 출력을 볼 수 있습니다.
디버깅 모드를 설정 해제하려면 다음을 사용하세요.set -
답변4
bash 내장 명령을 사용하여 compgen
모든 명령 및 모든 별칭 목록을 얻을 수 있습니다 compgen -ac
. 별칭이기도 한 모든 명령은 이 목록에 중복되므로 간단한 해결 방법은 의 출력에서 중복 항목을 찾는 것입니다 compgen -ac
.
그러나 명령이 경로에 두 번 나타나면 중복이 발생할 수도 있습니다. 예를 들어 별칭이 아니더라도 두 번 나열 하겠습니다 /bin/which
./usr/bin/which
compgen -ac
which
따라서 필요한 것은 그것으로부터 모든 중복 항목을 가져와서 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
둘 다에 공통적인 라인만 출력합니다.