私は比較的新しいzshユーザーで、99%の時間にわたってそれが好きです。たとえば、複数のファイルをコピーしようとすると、次のようになります。
[I] ➜ ls *17*
core.txt.17 info.17 vmcore.17.zst
しかし、そうすると、次のようなscp *17* xxx:xxx/xxx
結果が得られます。
[I] ➜ scp *17* freefall.freebsd.org:
*17*: No such file or directory
ler in /var/crash at borg
[I] ➜
なぜ?
を実行すると、type scp
次のようになります。
scp is an alias for noglob scp
scp is /usr/bin/scp
答え1
ご存知のように、zshには特定のコマンドに対してワイルドカード拡張を無効にする方法があります。入れたらnoglob
zshは、コマンドの前のコマンドワードをワイルドカードに拡張しません。入力はnoglob
しばしば引数にワイルドカードを引用するのと同じくらい難しいため、最も一般的な用途は、コマンド名をプレフィックスを使用して同じコマンド名のエイリアスにし、特定のコマンドを自動的に「一致させない」ことですnoglob
。例えば、
alias scp='noglob scp'
コマンドラインではワイルドカード拡張は使用できませんが、scp
それ以外の場合はscp
コマンドが正常に実行されます。
エイリアスをバイパスできます。
\scp *17* freefall.freebsd.org:
または
=scp *17* freefall.freebsd.org:
\scp
エイリアスを無視し、その名前で関数、組み込み、または外部コマンドを探します。=scp
外部コマンドのみを探します。
scp
パラメータを回避するワイルドカード拡張機能を使用すると、引用符なしで書き込むことができますが、scp remote:*17*
最大の欠点は書き込めないことですscp *17* remote:
。もう1つ、scp
パラメータがリモートファイル名と同じでない場合にのみ、ワイルドカードを拡張できます。これは、引数を解析し、scp
オプションやリモートファイル名のように見えない引数のワイルドカード文字のみを拡張する関数です。
function glob_non_remote {
local a x
a=($1); shift
for x; do
# Do wildcard expansion manually, but only for arguments that don't look
# like options or remote file names.
case $x in
(*:*|-*|) a+=("$x");;
*) a+=($~x);;
esac
done
"${(@)a}"
}
alias scp='noglob glob_non_remote scp'