2016-05-13 12 views
1

私はシステム上のディレクトリを便利に変更するのに理想的な簡単なスクリプトを書いています。実装のPythonで呼び出し元の現在の作業ディレクトリを変更する

詳細は重要ではなく、のが理想的に私は/usr/binでこのスクリプトを配置し、私は、システム上に行きたい引数を表すとそれを呼び出します言わせてはいけない:goto project1

私は期待しますスクリプトが終了したときに、私の端末の現在の作業はこれを実現するためには、プロジェクト1.

のものに変更されているであろうと、私が試した:

os.chdir('/') 

subprocess.call('cd /', shell=True) 

どちらも仕事のを。最初はPythonの作業ディレクトリを変更し、2番目のシェルはシェルを/に生成します。

その後、私はどれほど素朴な私が存在しているかを理解しました。プログラムが実行されると、端末はプロセスをフォークするだけで、私のプログラムが書き込んでいるstdoutから読み込みます。それが何であれ、端末の状態には影響しません。

しかし、私は "何年も前からcdを使用していましたが、確かに誰かがそのコードを書いていました"と思っていました。

ただし、cdcoreutilsでさえありません。代わりに、cdのソースはこれです:だから

builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"[email protected]"} 

、質問のカップルが頭に浮かぶ:

  • ユーザーがcdを呼び出したときに何が実際に舞台裏で起こっているの? (意味、端末とシステムが実際にやりとりする方法は?)
  • 端末の位置を変更するPythonスクリプトのようなものはありますか?

ありがとうございました!

+0

「発信者の現在の作業ディレクトリを変更する」 - 私が知っている限り、それは単に不可能です。他のプロセスの作業ディレクトリに挑戦することはできません。 – user2357112

+0

私はこれが答えだったかもしれないと考えました。 なぜbashはこれを許可しますか?これを行うために 'bash'で書かれたスクリプトを実行するなら、私は(明らかに)変更することができます。 –

+0

それを試してみてください。 'echo 'cd /'> cd.sh; 。/ cd.sh'を実行すると、作業ディレクトリが変更されていないことがわかります。 – user2357112

答えて

1

あなたがスクリプトのペアとしてそれを行うことができます:

directory.py

#!/usr/bin/python 

import sys 

directory = sys.argv[1] 

# do something interesting to manipulate directory... 

print directory + "tmp" 

directory.csh

#!/bin/csh -f 

cd `python directory.py $1` 

結果:

> pwd 
/Users/cdl 
> source directory.csh "/" 
> pwd 
/tmp 
> 

好きなシェルとPythonの変種を必要に応じて置き換えてください。さらに単純化するために、Pythonスクリプトの実行をオンにします。

明らかにシェルはディレクトリを変更していますが、Pythonはシェルをどこに送るかを知りたいという巧妙なロジックをすべて実行できます。

関連する問題