2012-01-23 5 views
1

python 모듈의 경로를 가져 오는 zsh 함수를 작성하려고합니다.zsh 함수 내에서 명령 출력 캡처

이 작동 :

pywhere() { 
    python -c "import $1; print $1.__file__" 
} 

그러나, 내가 좋아 정말 거라고하면 파일 이름없이 디렉토리 경로입니다. 작동하지 않습니다 :

pywhere() { 
    dirname $(python -c "import $1; print $1.__file__") 
} 

참고 :이 기능은 bash에서 작동하지만 zsh에서는 작동하지 않습니다!

편집이 오류입니다 :

~ % pywhere() { 
function → dirname $(python -c "import $1; print $1.__file__") 
function → } 
    File "<string>", line 1 
    import pywhere() { 
       ^
SyntaxError: invalid syntax 
+0

이 모양은 정확하며 나에게 적합합니다. 어떻게 당신을 위해 일하지 않습니까? – Gilles

+0

아 - 다른 시스템에서 똑같은 것으로 나타났습니다. 그래서 내 zsh 구성에서 뭔가 있어야합니다. – bee

+0

여기서 preexec에서 title 함수를 사용하면 오류가 발생합니다. http://dotfiles.org/~_why/.zshrc 이제 막 주석 처리했습니다. 이것이 왜 함수 정의를 방해하는지 정확히 알지 못합니다. – bee

답변

2

귀하의 문제로 인해 깨진 preexec : 당신은 제대로 때를 명령 줄을 인용하지 않습니다 그것을 창 제목에 포함시키기 위해 인쇄하십시오. (! 그렇게하지 않습니다 항상 정확한 파일 내용을 복사 - 붙여 넣기 사용한 것을 명령) :

a=${(V)1//\%/\%\%} 
a=$(print -Pn "%40>...>$a" | tr -d "\n") 
print -Pn "\ek$a:$3\e\\" 

print -P.zshrc 당신이 사용 된이하지 않은, 게시, 내가 볼에서

프롬프트가 확장됩니다. 인수에 명령을 포함시킵니다. 명령에서 두 문자로 % 문자를 보호하지만 충분하지 않습니다. 당신은 분명히 그렇게 print -P 함수를 정의하는 명령 줄에서 $(…) 구조가 실행되도록의 prompt_subst 옵션이 켜져 있습니다 $1 명령 행 (: pywhere { … } 함수 정의를)입니다

python -c "import $1; print $1.__file__" 

.

명령 줄을 구문 분석하지 말고 문자 그대로 인쇄하십시오. prompt_subst을 고려하지 않고 % 표지를 두 배로 늘렸지만 프롬프트 확장을 두 번 수행하고 \ 개의 시퀀스를 두 번 확장했기 때문에 두 배가되어야합니다.

function title() { 
    a=${(q)1} # show control characters as escape sequences 
    if [[ $#a -gt 40 ]]; then a=$a[1,37]...; fi 
    case $TERM in 
    screen) 
    print -Pn "\ek"; print -r -- $a; print -Pn ":$3\e\\";; 
    xterm*|rxvt) 
    print -Pn "\e]2;$2 | "; print -r -- $a; print -Pn ":$3\a";; 
    esac 
} 
+0

고마워요. 문제를 해결했습니다. – bee

1

왜 그냥이 사용

python -c "import os, $1; print os.path.dirname($1.__file__)" 
+0

멋진 아이디어, 감사 – bee