2009-09-29 4 views
1

필자는 항상 쉘에서 호출되는 python 스크립트를 가지고 있는데, 이는 zsh 또는 bash 일 수 있습니다.파이썬 : 호출 셸의 이름을 알려주시겠습니까?

어떤 스크립트를 호출했는지 어떻게 알 수 있습니까?

+0

!?! 왜 그걸 알고 싶니? –

+0

이해할 수있는 완료 데이터를 되돌려 보내야합니다. –

+0

아. 나는 물건 os.getenv ('셸') 그때 시도 가치가있다. 대부분의 유니 코드에서 작동해야하지만, 존재하지 않는 경우 사용자에게 추가하도록 요청하십시오. –

답변

6

리눅스에서 사용할 수있는 procfs의 :

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

os.getppid()는 부모 프로세스의 PID를 반환합니다. 이것은 휴대가 가능합니다. 그러나 프로세스 이름을 가져 오는 것은 휴대용 방식으로 수행 될 수 없습니다. 모든 유닉스에서 사용할 수있는 ps 출력을 구문 분석 할 수 있습니다 (예 : psutil.

+0

고마워요, 이것이 첫 번째 답변입니다! 게다가 놀랍도록 신기해합니다. –

+0

나는 모든 유닉스에서 작동하는 솔루션을 선호합니다. –

+1

필자는 이식성을 높이기 위해 몇 가지 힌트를 추가했습니다. –

-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

이것은 새로운 쉘을 시작하기 때문에 "호출하는"쉘에 대한 정보를 제공하지 않으므로 올바르지 않습니다. –

+0

쉘의 이름을 반환하지 않고 화면에 출력합니다. 또한 최소한 필자의 시스템에서는 파이썬을 호출 한 쉘에 상관없이 항상'sh'를 출력합니다. – sepp2k

+0

음,이 스크립트는 스크립트가 호출되었음을 나타내는 동일한 쉘을 가진 서브 쉘을 시작합니다 !!! – ennuikiller

0
당신은 신뢰할 수있는 자동화 된 방법으로이 작업을 수행 할 수

.

  • 환경 변수는 사용자가 악의적으로 변경할 수 있습니다. 대부분의 자동 쉘 변수는 "누출"하지 않습니다. 즉, 쉘 프로세스에서만 볼 수 있으며 자식 프로세스에서는 볼 수 없습니다.

  • 부모 PID를 알아 낸 다음 해당 ID의 프로세스 목록을 검색 할 수 있습니다. 백그라운드에서 실행되는 경우 작동하지 않습니다 (이 경우 PPID는 항상 1입니다).

  • 사용자는 스크립트 내에서 프로그램을 시작할 수 있습니다. 이 경우 올바른 쉘은 무엇입니까? 스크립트가 시작된 스크립트 또는 스크립트의 쉘?

  • 다른 프로그램은 스크립트를 실행하기 위해 시스템 호출을 사용할 수 있습니다. 이 경우 껍질 또는 아무것도 얻지 못할 것입니다. 당신이 사용자의 환경에 대한 절대 제어 할 경우

, 다음 항상 시작. IIRC에서 읽을 수있는 파일에 대한 BASH 및 zsh을위한 매뉴얼을 확인 (자신의 프로필에 변수를 넣어, 그것은 BASH에 대한 .profile입니다).

[편집] 두 쉘 모두에 대해 호출되는 별칭을 만듭니다. 별칭에서

env SHELL_HINT="x$BASH_VERSION" your_script.py 

zsh의 경우 "x", bash의 경우 다른 것으로 평가해야합니다.

+0

글쎄, 아무리 불평해도 상관 없습니다 :) 유닉스에서 프로세스는 분리되어야합니다. 특히 어린이들에게 특별히 말하지 않는 한 껍질은 특히 보수적이지 않습니다. –

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

스크립트가 시스템 쉘에서 실행되지 않으면이 기능이 작동하지 않습니다. –

+0

특히 믿을만하지만 단순하지 않으며 적어도 잘못되었습니다. :-) –

+1

@Lennart : OP가 필요할 때 정확히 작동하지 않습니다. – SilentGhost

관련 문제