입력한 명령의 별칭을 식별합니다.

입력한 명령의 별칭을 식별합니다.

명령줄에 입력한 명령에 이미 별칭이 있음을 인식할 수 있는 쉘/쉘스크립트가 있습니까?

예를 들어

쉘에 내가 입력

git checkout master

쉘 프린트"You can use alias you have for that : gcm"

그런 다음 쉘은 평소대로 마스터 확인을 진행합니다.

이 명령은 사용 가능한 모든 별칭을 나열한다는 것을 알고 있습니다 alias. 별칭을 사용하지 않을 때 별칭을 사용하고 전체 명령을 입력하도록 쉘에서 상기시켜 주기를 원합니다.

답변1

이는 개념적 접근이다.가능한일하다.

alias명령은 모든 별칭 목록을 생성하며 각 별칭 뒤에는 별칭 =과 해당 정의가 옵니다. 이 출력은 첫 번째 공백부터 첫 번째 까지 별칭 이름을 추출하여 구문 분석할 수 있습니다 =. 첫 번째 이후의 모든 것은 =일치하는 정의입니다. 이는 awk에서 연관 배열을 사용하면 쉽게 처리할 수 있는 것처럼 들립니다.

(내 생각에는) 이것에 대한 두 가지 합병증이 있습니다.

1) 정의는 여러 단어로 구성될 수 있으므로 정의의 길이에서 둘러싸는 따옴표를 뺀 길이를 측정하고 입력된 명령에 대한 비교를 해당 길이로 제한해야 합니다.

2) 별칭에는 이상한 내용이 포함될 수 있습니다. 나에게 가장 이상한 것은 다음과 같습니다(더 이상해질 것이라고 확신합니다).

alias pqp='cd ~/pq;[ -n "$(ls)" ] && mprb * || echo "Print Queue Empty"'

여기서 요점은 별칭이 쉘이 해석하고 확장하려는 모든 특수 문자를 (거의?) 포함할 수 있으므로 비교해야 하는 두 문자열을 간단한 것으로 처리하는 awk 또는 Python과 같은 다른 언어로 인코딩하는 것이 더 낫다는 것입니다. 끈.

다음 문제는 일치가 완료되고 메시지가 방출된 후에 실제로 명령을 실행하려는 것입니다.

여기서 우려되는 점은 프로그램 내에서 실행하는 모든 것이 다른 스크립트일지라도 (일반적으로) 하위 프로세스에서 실행된다는 것입니다. 이는 명령이 종료되고 하위 쉘이 닫히면 명령의 모든 (쉘 수준) 부작용이 손실됨을 의미합니다. 가장 확실한 것은 $?유틸리티의 반환 코드로 캡처하여 다시 내보내야 하는 반환 코드입니다.

별칭에 source, .명령을 사용하는 호출이 포함되어 있으면 운이 좋지 않습니다. 서브셸에서 명령을 실행하면 예상되는 부작용이 완전히 무효화되기 때문입니다.

Shell에는 많은 내장 명령이 포함되어 있습니다. 예를 들어 cd일부는 [동일한 프로그램을 가지고 있지만 /usr/bin/test일부는 cd그렇지 않으며 동일한 작업을 수행하는 프로그램의 경우에도 내장 버전이 항상 동일한 동작과 옵션을 갖지는 않습니다. 외부 버전으로.

위의 문제는 최종 명령이 현재 쉘 레벨의 표준 입력이 아닌 다른 곳에서 나오므로 다르게 처리되기 때문에 발생합니다. 여기가 비슷한 곳이에요자동 키어쩌면 도움이 될 수도 있습니다.

AutoKey는 X(gui) 환경에서 다양한 작업을 자동화하는 데 사용할 수 있는 매크로 프로세서입니다. 이 경우 사용자 정의 단축키를 누를 때 매크로를 호출하는 데 사용할 수 있습니다. 이 매크로는 사용자가 입력하는 명령줄을 읽고 구문 분석하고, 메시지(별명 등에 대한 정보)를 내보내고, 마치 키보드에서 입력한 것처럼 명령을 다시 입력할 수 있습니다.

여기서의 장점은 Linux(실제로 데스크탑 환경/터미널 에뮬레이터)가 명령을 입력한 사람인지 여부를 알 수 없으며 마치 AutoKey가 없는 것처럼 원래 기본 환경에서 모든 일이 발생한다는 것입니다.

이 접근 방식의 두 번째 장점은 먼저 단축키를 누르지 않고 명령만 입력하면 오버헤드 없이 모든 것이 평소대로 작동한다는 것입니다.

이것은 StackExchange 및 다른 곳의 여러 곳에서 길게 논의된 마지막 요점으로 이동합니다.

시스템의 일반적인 부분을 가져와 사용자(이 경우에는 귀하)에게 완전히 표시될 때 배후에서 기본 작업 방식을 변경하는 것은 거의 항상 나쁜 생각입니다.

즉, 비표준 방식으로 작동하도록 시스템을 사용자 정의하는 경우 두 가지 주요 결과가 발생합니다.

1) 다른 사람이 시스템을 사용하는 경우(예: 문제 디버깅을 돕기 위해) 예상치 못한 결과가 발생하여 불쾌한 결과가 많이 발생할 수 있습니다.

2) 수정된 동작에 익숙해지면 동일한 방식으로 사용자 정의되지 않은 다른 시스템을 사용할 때 (무의식적으로) 해당 동작이 작동할 것으로 기대합니다.

일반적인 예는 다음과 같은 별칭을 정의하는 것입니다.

alias rm='rm -i'

다른 시스템에 입력하고 rm처음 메시지가 표시될 때 파일이 즉시 삭제될 것으로 예상하기 전까지는 이는 좋은 생각처럼 들립니다.

이 문제에 대한 해결책은 다음과 같습니다.

alias rmi='rm -i'

입력하면 작동하지만 다른 시스템에 입력하면 명령을 찾을 수 없음 오류를 실행하는 것 외에는 아무 작업도 수행되지 않을 수 있습니다.

이는 중요한 일이 중단되어 원하는 만큼 주의를 기울이지 않고 문제를 해결해야 한다는 압력을 받는 한밤중에 특히 중요합니다.지금. 예상치 못한 행동이나 일이 정말 원하지 않을 때 사람들에게 설명하는 데 시간을 낭비해야 합니다.

핫키 활성화 AutoKey 매크로를 사용하여 별칭 검사와 동일하게 작동합니다. 단축키를 눌러 매크로를 활성화하려고 애쓰지 않는다면 모든 것이 예상대로 작동할 것입니다. 적절하게 선택한 단축키는 실수로 누르는 일이 없으며, 다른 시스템에서 습관적으로 눌러도 해로운 영향을 미치지 않을 수 있습니다.

답변2

나는 해결책을 가지고 있습니다 bash. 각 명령 전에 실행되는 함수가 필요합니다. 이는 기본적으로 지원되지 않으므로 문제를 해결하려면 트랩을 bash사용해야 합니다 .DEBUG

Bash 매뉴얼 페이지의 트랩 섹션을 참조하세요 DEBUG.

sigspec이 DEBUG인 경우 arg 명령은 모든 단순 명령(명령, case 명령, select 명령, 명령의 모든 산술) 이전 및 쉘 함수에서 첫 번째 명령이 실행되기 전에 실행됩니다.

따라서 함수는 다음과 같습니다(첫 번째 부분은 함수에서 복사되었습니다).슈퍼유저 답변):

preexec () {
  [ -n "$COMP_LINE" ] && return  # do nothing if completing
  [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
  local this_command=$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")
  # check if the command occures as an alias
  a=$(alias | grep -F "='""$this_command""'" | grep -oP '(?<=alias\ )[^=]+')
  # if yes, print a notice
  [ -n "$a" ] && echo -e "You can use an alias you have for that: \033[01;32m$a\033[00m"
}
trap 'preexec' DEBUG

입력할 때:

$ git checkout master

다음과 같이 인쇄됩니다.

You can use an alias you have for that: gcm

그런 다음 명령을 계속 실행합니다.

답변3

내가 원하는 것에 대해 더 자세히 조사하는 동안 이것을 발견했습니다.

zsh용 플러그인이 있습니다별칭 프롬프트이 일을 해냈습니다.

관련 정보