프로젝트를 처리하기 위해 몇 가지 별칭을 만들었습니다 nodejs
. 예를 들면 다음과 같습니다.
alias lsc="cat package.json | jq '.scripts'"
scripts
이 파일 섹션 package.json
에서 사용 가능한 모든 명령을 나열합니다 .
이상적으로는 내 경로에 있는 기존 실행 npm scripts
파일 로 실행하고 싶습니다 .npm something
npm
내 별칭을 추가하기 위해 이 기능을 확장할 수 있습니까?
답변1
면책조항: 알아요아무것도 없다Node.js 또는 npm
.
이 명령을 대체하는 쉘 함수를 사용하십시오 npm
.
npm () {
if [ "$1" = scripts ]; then
jq '.scripts' package.json
else
command npm "$@"
fi
}
이 쉘 함수는 함수의 첫 번째 매개변수가 문자열인지 확인합니다 scripts
. 그렇다면 jq
명령이 실행됩니다. 그렇지 않은 경우 npm
원래 명령줄 인수를 사용하여 실제 명령을 호출합니다.
이 command
유틸리티는 다음을 보장합니다.기능호출되지 않습니다(그렇지 않으면 무한 재귀가 생성됩니다).
위의 코드는 일반 별칭이 정의된 모든 위치에 배치될 수 있습니다.
만약에npm
이미쉘 기능은 올바른 일을 하지 않습니다.
이것을 많은 새로운 하위 명령으로 확장하면 if
코드 then
가 elif
복잡해집니다. 대신에:
npm () {
case $1 in
scripts) jq '.scripts' package.json ;;
hummus) hummus-command ;;
cinnamon) spice-command ;;
baubles) stuff ;;
*) command npm "$@"
esac
}
그러면 다른 명령을 호출하기 위한 scripts
, hummus
및 cinnamon
하위 명령이 생성됩니다 . 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