エイリアス内で拡張されていないzsh glob変数を使用する

エイリアス内で拡張されていないzsh glob変数を使用する

特定のパターンに一致するすべてのファイルを時間ごとに一覧表示して並べ替えてから、上位20個だけをインポートしたいと思います。

ls -laths *.txt | head -20

たとえば、2つのファイルを作成するとうまくいきます。

touch 1.txt
touch 2.txt

上記のコマンドの結果は次のとおりです。

$ ls -laths *.txt | head -20
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 2.txt
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 1.txt

端末でこれを行うと正常に動作します。しかし、それをエイリアス(入力$ 1が私が望むパターンである)として保存しようとすると、次のようになります。

alias lis20='function _(){ ls -laths "${1}" | head -20; }; _'

次にエイリアスを使用すると、次のような結果が得られます。

$ lis20 *.txt
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 1.txt

つまり、最初のファイルだけが一覧表示されます。次のように内部変数の複数の拡張を試みました。質問しかし、成功しませんでした。

私はzshを使っていますが、bashとzshの両方で動作する解決策があればいいと思います。

答え1

エイリアスはテキスト拡張であるため、lis20 *.txtエイリアスは最初に次に拡張されます。

function _(){ ls -laths "${1}" | head -20; }; _ *.txt

その後、ファイル名の生成は関数呼び出しを次に置き換えます。

_ abc.txt def.txt etc.txt

したがって、関数には最初に$1一致するファイル名のみが含まれます。

これで、関数で次の代わりにこの問題を解決できます。 ("$@"魔法です。引用符にもかかわらず、複数の単語に展開され、すべての引数が分離されて完全です。)"$1""$@"

しかし、実際には機能は必要ありません。そしてとにかくエイリアスです。ただ1つの関数で作成してください。

lis20() {
    ls -laths "$@" | head -20
}

関連情報