2009-09-29 16 views
1

我有一個總是從shell調用的python腳本,它可以是zsh或bash。Python:你能告訴調用shell的名字嗎?

我怎麼知道哪一個叫腳本?

+0

!?!你爲什麼想要知道? – 2009-09-29 13:52:07

+0

發回可以理解的完成數據。 – 2009-09-29 13:53:36

+0

啊。我的東西os.getenv('SHELL')值得一試。應該在大多數情況下工作(但嘿,誰知道),如果它不存在,請求用戶添加它。 – 2009-09-29 14:03:30

回答

6

在Linux中,你可以使用PROCFS:

>>> os.readlink('/proc/%d/exe' % os.getppid()) 
'/bin/bash' 

os.getppid()返回父進程的PID。這是便攜式的。但獲取進程名稱不能以便攜方式完成。您可以解析所有單位都可用的輸出ps,例如與psutil

+0

謝謝,這是第一個工作答案!此外,這是奇妙的隱晦:) – 2009-09-29 13:46:50

+0

我寧願一個解決方案適用於所有unices,但。 – 2009-09-29 13:47:56

+1

我已經添加了一些提示,使其更便於攜帶。 – 2009-09-29 14:11:10

-2

使用os.system( 「回聲$ 0」)

這完美的作品在我的系統:

cat shell.py: 

    #!/ms/dist/python/PROJ/core/2.5/bin/python 

    import os 
    print os.system("echo $0") 


bash-2.05b$ uname -a 
Linux pi929c1n10 2.4.21-32.0.1.EL.msdwhugemem #1 SMP Mon Dec 5 21:32:44 EST 2005 i686 athlon i386 GNU/Linux 


pi929c1n10 /ms/user/h/hirscst 8$ ./shell.py 
/bin/ksh 
pi929c1n10 /ms/user/h/hirscst 9$ bash 
bash-2.05b$ ./shell.py 
/bin/ksh 
bash-2.05b$ 
+0

這是不正確的,因爲它啓動一個新的shell,它沒有給出有關「調用」shell的任何信息。 – 2009-09-29 13:28:23

+0

這不會返回shell的名稱,它會將它打印到屏幕上。至少在我的系統中,無論我從哪個shell調用python,這總是會打印'sh'。 – sepp2k 2009-09-29 13:29:45

+0

嗯,這將啓動一個subhell與同一個shell可執行,腳本被稱爲! – ennuikiller 2009-09-29 13:32:21

0

你不能在一個可靠的自動化的方式做到這一點。

  • 環境變量可能會引起誤解(用戶可以惡意切換它們)。大多數自動shell變量不是「泄漏」的,即它們只能在shell進程中看到,而不能在子進程中看到。

  • 你可以找出你的父PID,然後搜索該ID的進程列表。如果您在後臺運行,則不起作用(在這種情況下,PPID始終爲1)。

  • 用戶可以從腳本中啓動程序。在這種情況下哪個殼是正確的?腳本啓動的地方還是腳本的shell?

  • 其他程序可以使用系統調用來運行腳本。在這種情況下,你會得到他們的外殼或者什麼也沒有。

如果你有在用戶的環境絕對的控制權,然後把一個變量在他們的個人資料(檢查是否有bash和ZSH手冊的文件,該文件是總是在啓動時。IIRC閱讀,這.profile的BASH )。

[編輯]創建一個爲兩個shell調用的別名。在別名中,使用

env SHELL_HINT="x$BASH_VERSION" your_script.py 

這應該評估爲「x」zsh和別的東西bash。

+0

嗯,它不會,不管你抱怨多少:)在Unix上,進程意味着孤立。他們通常不會將東西泄漏到子流程中,除非您特別告訴他們,而且彈殼特別保守。 – 2009-09-29 13:54:45

0
import os 
shell = os.getenv('SHELL') 
+2

如果腳本未從系統shell執行,則這不起作用。 – 2009-09-29 13:54:13

+0

不是特別可靠,但很簡單,並不是錯誤。 :-) – 2009-09-29 13:56:02

+1

@Lennart:並且在OP需要時無法正常工作。 – SilentGhost 2009-09-29 14:03:23

相關問題