zshが* 17 *のようなファイルグローブを好きではないのはなぜですか?

zshが* 17 *のようなファイルグローブを好きではないのはなぜですか?

私は比較的新しい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には特定のコマンドに対してワイルドカード拡張を無効にする方法があります。入れたらnoglobzshは、コマンドの前のコマンドワードをワイルドカードに拡張しません。入力は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'

おすすめ記事