すべてのエイリアスをgrepするために使用されるZSHエイリアスが動作を停止しました。

すべてのエイリアスをgrepするために使用されるZSHエイリアスが動作を停止しました。

これは約8年間私にとって効果的でした。

$ alias al='alias | grep $1'

例:

$ al git
clean='git clean -xfde'
echo_git_root='echo "$(git rev-parse --show-toplevel || echo .)"'
# etc.

likeを呼び出すと、al git私のすべてのgitエイリアスが表示されます。

しかし今は次のようになります。

$ al git
grep: git: No such file or directory

エイリアスが置き換えられていないようです。

$ alias al
al='alias | grep $1'

もちろん、(別名をバイパスして)nakedコマンドを実行すると、正常に動作します。

$ alias | grep git
clean='git clean -xfde'
echo_git_root='echo "$(git rev-parse --show-toplevel || echo .)"'
# etc.

私は試した:

  • al='alias | /usr/bin/grep $1'
  • al='alias | \grep $1'
  • al='alias | grep ''$1'''
  • al='alias | grep \\'$1\\''

この時点で私はアイデアを持っていません!

最近、MacOS MontereyからVenturaにアップグレードしました。以前のZSHバージョンが何であるかはわかりませんが、現在は5.9です。これが関連しているかどうかはわかりませんが、これは私のシステムに対する唯一の最近の変更です。

答え1

エイリアスはパラメータを使用せず、テキストを他のテキストに置き換えます。それらは非常に過酷な形式のプログラミング構造です。機能のないcshから来ました。

alias al='alias | grep $1'

コマンドの場所でトークンが見つかるたびにalトークンが置き換えられると言うと、次のようになります。alias | grep $1

al git

次に置き換えられます:

alias | grep $1 git

これはシェルコードとして解釈されます。

空または設定されていない場合は、$1次のようになります。

alias | grep git

ただし、set foo baror1=fooまたはorの後に実行すると、argv[1]=foo次のようになります。

alias | grep foo git

標準入力を無視してファイル内を見つけますgrepfoogit

ここにBourneスタイルが必要です。

al() alias | grep "$@"

またはcshスタイル²:

alias al='alias | grep'

1cshエイリアスソースの履歴拡張に関連するいくつかのトリックを使用して、エイリアスが引数を受け入れることができるように見えますが、これらのトリックはKornなどのシェルでは機能しません。

²まあcsh、タグにエイリアスを追加します。 POSIXはインターフェイスを指定して複製しますが、制限を解決することもできます( 。alias al 'alias | grep'alias token replacementalias token=replacement=shzshzshaliases['=']=uname'='uname

関連情報