コマンドを拡張して自分のエイリアスを追加できますか?

コマンドを拡張して自分のエイリアスを追加できますか?

プロジェクトを処理するためにいくつかのエイリアスを作成しました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これにより、他のコマンドを呼び出すためのサブコマンドと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

おすすめ記事