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
별칭은 가난한 사람의 역할 이다 . 별칭은 실제로 명령이 아니며 텍스트 대체에 가깝습니다. alias
es는 다음과 같이 기능을 사용할 수 없는 상황에 대한 해킹 도구로 기능이 있는 고급 쉘에서 사용할 수 있습니다.
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
"foo
bar"
e
echo $(uname)
echo Linux
Q