2012-01-23 9 views
1

pythonモジュールへのパスを取得するためのzsh関数を記述しようとしています。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

私は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あなたが使用したものではありませんこれは、掲示、私が見るには

プロンプト拡張を引き起こす。引数にコマンドを含めます。あなたはコマンド内の%文字を2倍にして保護しますが、これでは十分ではありません。あなたは明らかにそうprint -Pは、関数を定義し、コマンドラインで$(…)構築物が実行されるようになり、prompt_substオプションがオンになっている:$1は、コマンドライン(:pywhere { … }関数定義を)です

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

コマンドラインを解析するのではなく、文字通り出力してください。 prompt_substを考慮しないと、%という記号が2倍になりますが、プロンプト展開を2回実行してから\のシーケンスを2回展開するため、4倍にする必要があります。

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

関連する問題