2012-01-23 2 views
1

Я пытаюсь написать функцию zsh, чтобы получить путь к модулю python.Вывод команды захвата внутри функции zsh

Это работает:

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

Однако то, что я действительно хотел это реж путь без имени файла. Это не работает:

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

Примечание: оно работает в bash, но не в zsh!

EDIT это ошибка:

~ % 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

Ошибка возникает, если я использую функцию title в 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

Смежные вопросы