2012-01-23 86 views
1

我想寫一個zsh函數來獲取python模塊的路徑。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中使用標題函數,則會發生錯誤: http://dotfiles.org/~_why/.zshrc 我剛剛對此進行了評論。不確定爲什麼這會干擾函數定義。 – bee

回答

2

你的問題是由於破preexec:你是不是引用命令行正確,當你打印它包含在窗口標題中。

.zshrc您發佈,這是不是你所使用的,我看(不這樣做,始終複製粘貼確切的文件內容,並命令你使用!):

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

print -P導致及時擴展。您在參數中包含命令。通過加倍命令來保護命令中的%角色,但這還不夠。你顯然有prompt_subst選項導通,從而使print -P要執行的$(…)構建體在定義該函數的命令行:

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

其中$1是命令行(函數定義:pywhere { … })。

而不是嘗試解析命令行,從字面上打印出來。這也會糾正其他錯誤:除了沒有考慮到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