별칭 내에서 확장되지 않은 zsh glob 변수 사용

별칭 내에서 확장되지 않은 zsh glob 변수 사용

특정 패턴과 일치하는 모든 파일을 시간별로 나열하고 정렬한 다음 상위 20개만 가져오고 싶습니다.

ls -laths *.txt | head -20

예를 들어 두 개의 파일을 만드는 경우 잘 작동합니다.

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""$@"

그러나 실제로는 기능이 필요하지 않습니다.그리고어쨌든 별칭입니다. 그냥 단일 함수로 만드세요.

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

관련 정보