
超越しよう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
またはインコマンドラインでのみ機能します。関数が呼び出されると、無効な名前で変数を設定しようとしますが、失敗します。func
dockerps
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
技術的には、バグ機能がどこから出てくるかなど、csh
次alias
のようにできます。
alias docker='docker '
alias ps='ps --format="table {{.ID}} {{.Image}} {{.Status}}"'
これにより、目的の結果が得られますが、これは次のことを意味します。
- 後に続くすべての単語は
docker
エイリアス拡張の影響を受けます。 (このトリックは、コマンドを引数として取るなどのコマンドalias cmd='cmd '
に適用されるため、エイリアスもその後に拡張されます。)command
env
sudo
ps
前にない単語も拡張されます。つまり、呼び出しフレーズを変更しない限り、スタンドアロンコマンドを実行することはdocker
できません(たとえば)。ps
"ps" -ef
ここでは新しいものを定義します。注文する目的の操作を実行する元の名前と競合しないように、別の名前を使用してください。
my-docker-ps() docker ps --format="table {{.ID}} {{.Image}} {{.Status}}" "$@"
これは関数として実装されていますが、シェルの外部でも使用できるようにスクリプトとして実装する方が良いかもしれません。