エイリアスを使用して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 "$@"
}

おすすめ記事