ターミナルのコマンドに新しいランタイムフラグ/オプションを追加しますか?

ターミナルのコマンドに新しいランタイムフラグ/オプションを追加しますか?

ターミナルから実行されるコマンドに新しいランタイム フラグを追加する方法を見つけようとしています。

たとえば、最近 Docker を試し始めたのですが、ID をコピーして貼り付けることで終了したコンテナーをクリーンアップするのは面倒です。ランタイムcleanにコマンドライン オプションを追加してdocker、実行時にdocker clean(または、docker --cleanその方法を採用する場合)、Docker ランタイムで既にサポートされているオプション (つまり ) を使用してクリーンアップ コマンドを実行するように内部的にマッピングできるようにしたいと考えています。docker rm $(docker ps -a -q -f status=exited)このようなマッピングを確立することは可能ですか?

1 つのオプションとしてエイリアスを使用することはわかっていますが、私の知る限り、エイリアスではエイリアス名にスペースやコマンド ライン フラグを含めることはできません。同様に、シェル関数は機能全体を上書きするため役に立ちません (または、私が間違っているのかもしれません)。この可能性をしばらく検討したいと思っていたので、どんな助けでもいただければ幸いです。

答え1

実行可能ファイルと同じ名前の bash 関数を定義し、追加のパラメータを処理して、組み込み関数を使用して元の関数を明確に呼び出すことができますcommandman bash

command [-pVv] command [arg ...]
       Run  command  with  args  suppressing  the normal shell function
       lookup. Only builtin commands or commands found in the PATH  are
       executed.

説明する、

function ls() { 
  case "$1" in 
    "foo")  shift
            echo "do new thing with remaining args: $@" 
            ;; 
    *)      command ls "$@"
            ;;
  esac
}

それから

$ ls -ltr --color=always
total 12
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:16 subdir1
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir2
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir3

通常通り動作しますが、

$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always

(これを試すには、 コマンドが必要になる場合があります) unaliasls

明らかに、実際の実装では適切なエラー チェックを行う必要があります。おそらく、getopts単純な switch/case on ではなく、 を使用してコマンド ライン全体を処理します$1


あるいは(より伝統的な方法では)ラッパースクリプトそして、それを 内の元の実行可能ファイルよりも前の場所$PATH/usr/local/binやなど$HOME/bin)に配置します。ラッパー内では、元の実行可能ファイルを絶対パスで参照します。

関連情報