Вывод команды захвата внутри функции zsh - PullRequest
1 голос
/ 24 января 2012

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

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

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

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Ваша проблема связана с неработающим 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
}
1 голос
/ 29 января 2012

Почему бы просто не использовать это:

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