エイリアスを使用してzshで複数の単語コマンドをオーバーライドする方法は?

エイリアスを使用してzshで複数の単語コマンドをオーバーライドする方法は?

超越しようdocker psとするdocker ps --format="table {{.ID}} {{.Image}} {{.Status}}"

私は読んだこの問題と参照文書がありますが、正しく動作しません。

私はいくつかの「コンパイル」アプローチを試しましたが、これは最新の試みです。

alias func='dockerps'

function dockerps() {
 'docker ps'='docker ps --format="table {{.ID}} {{.Image}} {{.Status}}"'$\
}

docker ps入力時に書式が維持されるようにコードを変更するにはどうすればよいですか?

答え1

複数の単語で構成されるエイリアスのようなものはありません。あなたが言及したSOの答えは私にとって完全に間違っているようです。それは言葉ではなく、zshの歴史4.3を掘り下げても、あなたが望む効果に近いものを生成する関数の痕跡を見つけることができません(zsh An開発バージョンにあった可能性がある実験的機能)は、5.0リリース以前に削除されました。作成した内容は明確に定義された意味を持ちます。エイリアスfuncと呼ばれる関数を定義するので、最初の単語がコマンドラインdockerpsまたはインコマンドラインでのみ機能します。関数が呼び出されると、無効な名前で変数を設定しようとしますが、失敗します。funcdockerps

Zshを使用すると、特殊文字を含む単語のエイリアスを定義できます。

darkstar% alias "'docker ps'"='echo docker ps in single quotes'
darkstar% alias 'docker\ ps'='echo docker backslash ps'                 
darkstar% 'docker ps'
docker ps in single quotes
darkstar% docker\ ps
docker backslash ps
darkstar% "docker ps"
zsh: command not found: docker ps

しかし、特に役に立ちません。'docker ps'一つの言葉ではなくdocker ps二つの言葉です。

一般的な方法で行う必要があります。つまりdocker、という関数を定義し、その引数を分析するようにします。これはグローバルオプションをサポートする単純なバージョンですが、パラメータを持つグローバルオプションの--option=value代わりに使用する必要があります--option value

docker () {
  setopt local_options extended_glob unset
  local -i i=$argv[(i)^-*]
  # $argv[i] is the first non-option argument (or empty if there is none).
  # See if we want to insert something after it.
  case $argv[i] in
    ps) argv[i+1,i]=(--format="table {{.ID}} {{.Image}} {{.Status}}");;
  esac
  command docker "$@"
}

答え2

技術的には、バグ機能がどこから出てくるかなど、cshaliasのようにできます。

alias docker='docker '
alias     ps='ps --format="table {{.ID}} {{.Image}} {{.Status}}"'

これにより、目的の結果が得られますが、これは次のことを意味します。

  1. 後に続くすべての単語はdockerエイリアス拡張の影響を受けます。 (このトリックは、コマンドを引数として取るなどのコマンドalias cmd='cmd 'に適用されるため、エイリアスもその後に拡張されます。)commandenvsudo
  2. ps前にない単語も拡張されます。つまり、呼び出しフレーズを変更しない限り、スタンドアロンコマンドを実行することはdockerできません(たとえば)。ps"ps" -ef

ここでは新しいものを定義します。注文する目的の操作を実行する元の名前と競合しないように、別の名前を使用してください。

my-docker-ps() docker ps --format="table {{.ID}} {{.Image}} {{.Status}}" "$@"

これは関数として実装されていますが、シェルの外部でも使用できるようにスクリプトとして実装する方が良いかもしれません。

関連情報