プロジェクトを処理するためにいくつかのエイリアスを作成しました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