zargs가 별칭을 실행할 수 있나요?

zargs가 별칭을 실행할 수 있나요?

pip install -U에 별칭을 지정 했습니다 pi. 다음을 실행하고 싶습니다.

zargs ~/scripts/python/**/requirements.txt -- pi -r

이를 수행할 수 있는 방법이 있습니까?

나는 또한 다음과 같은 추악한 옵션을 시도했습니다.

zargs ~/scripts/python/**/requirements.txt -- ${aliases[pi]} -r

그러나 그것은 말한다 (eval):2: command not found: pip install -U.

나는 zargs가 zsh에 내장되어 있기 때문에 이러한 일을 할 수 있어야 한다고 생각합니다.

답변1

csh별칭은 가난한 사람의 역할 이다 . 별칭은 실제로 명령이 아니며 텍스트 대체에 가깝습니다. aliases는 다음과 같이 기능을 사용할 수 없는 상황에 대한 해킹 도구로 기능이 있는 고급 쉘에서 사용할 수 있습니다.

alias forever='while true; do'

또는

alias fail='{ echo >&2 FAIL; return 1; }'

이것은 기능과 함께 작동하지 않습니다. 하지만 여기는 그중 하나가 아닙니다.

alias pi='pip install -U'

정의하지 않습니다pi 주문하다, 이는 다음을 정의합니다.pi 별명. 여기서 확장하면 간단한 명령의 시작이 되지만 명령이 필요한 모든 경우에 별칭은 확장되지 않습니다. 특히, 여기처럼 함수 내부에서는 확장되지 않습니다 zargs. (물론 확장되지만 함수가 호출될 때)정의forever, 우리 또는 fail그 이상이 유용할 수 있는 별칭을 호출하는 대신 ). 그리고 일부 부적절한 상황(예: )에서는 확장됩니다 pi() { ...; }.

전역 별칭은 솔루션이 아니며 전역 별칭은 여전히 ​​명령이 아니며 여전히 텍스트 교체를 수행하지만 더 많은 경우 확장됩니다.

~ 후에

alias -g pi='pip install -U'

이제 pi단어가 나타나는 곳마다 확장됩니다. 예를 echo pi들어 pip install -U.

여기에서 명령을 정의하려면 pi함수를 사용할 수 있습니다.

pi() pip install -U "$@"

그 사람은 이라고 불릴 것입니다 zargs.

그리고 당신 것pi 단순한별칭으로도 다음 작업을 수행할 수 있습니다.

zargs ~/scripts/python/**/requirements.txt -- ${=aliases[pi]} -r

즉, $IFS별명 정의 시 -splitting이 호출됩니다. 아니면 한 단계 더 나아가세요.

zargs ~/scripts/python/**/requirements.txt -- "${(@Q)${(ze)aliases[pi]}}" -r    

z참조를 고려하면서 분할(예: , echo "foo bar"및 대신 echo및 로 분할 ), 확장 수행(예: 로 확장 ), 따옴표 제거는 더 많은 경우에 더 나은 근사치를 제공합니다."foo bar"echo"foobar"eecho $(uname)echo LinuxQ

관련 정보