명령을 확장하여 내 별칭을 추가할 수 있나요?

명령을 확장하여 내 별칭을 추가할 수 있나요?

프로젝트를 처리하기 위해 몇 가지 별칭을 만들었습니다 nodejs. 예를 들면 다음과 같습니다.

alias lsc="cat package.json | jq '.scripts'"

scripts이 파일 섹션 package.json에서 사용 가능한 모든 명령을 나열합니다 .

이상적으로는 내 경로에 있는 기존 실행 npm scripts파일 로 실행하고 싶습니다 .npm somethingnpm

내 별칭을 추가하기 위해 이 기능을 확장할 수 있습니까?

답변1

면책조항: 알아요아무것도 없다Node.js 또는 npm.

이 명령을 대체하는 쉘 함수를 사용하십시오 npm.

npm () {
    if [ "$1" = scripts ]; then
        jq '.scripts' package.json
    else
        command npm "$@"
    fi
}

이 쉘 함수는 함수의 첫 번째 매개변수가 문자열인지 확인합니다 scripts. 그렇다면 jq명령이 실행됩니다. 그렇지 않은 경우 npm원래 명령줄 인수를 사용하여 실제 명령을 호출합니다.

command유틸리티는 다음을 보장합니다.기능호출되지 않습니다(그렇지 않으면 무한 재귀가 생성됩니다).

위의 코드는 일반 별칭이 정의된 모든 위치에 배치될 수 있습니다.

만약에npm 이미쉘 기능은 올바른 일을 하지 않습니다.


이것을 많은 새로운 하위 명령으로 확장하면 if코드 thenelif복잡해집니다. 대신에:

npm () {
    case $1 in
        scripts)  jq '.scripts' package.json ;;
        hummus)   hummus-command ;;
        cinnamon) spice-command ;;
        baubles)  stuff ;;
        *) command npm "$@"
    esac
}

그러면 다른 명령을 호출하기 위한 scripts, hummuscinnamon하위 명령이 생성됩니다 . baubles함수의 첫 번째 인수가 사용자 정의 하위 명령과 일치하지 않으면 npm실제 명령은 이전과 같이 호출됩니다.

대안 추가에 유의하세요.기존의 npm하위 명령은 이 하위 명령보다 우선 적용됩니다 npm. 그렇게 부르고 싶다면진짜자체 재정의 하위 명령의 하위 명령 command npm "$@"(하위 명령 이름을 닫기 위해 호출하지 않았다고 가정하고 shift이 경우 호출하려고 함 command npm sub-command "$@").

각각의 새로운 하위 명령은 함수의 명령줄 인수에 액세스할 수 있지만 shift하위 명령의 이름을 목록에서 제거할 수도 있습니다.

npm () {
    case $1 in
        scripts)  jq '.scripts' package.json ;;
        hummus)
            shift
            echo '"npm hummus" was called with these additional arguments:'
            printf '%s\n' "$@"
            ;;
        *) command npm "$@"
    esac
}

실행 중인 마지막 함수의 예:

$ npm hummus "hello world" {1..3}
"npm hummus" was called with these additional arguments:
hello world
1
2
3

관련 정보