foocaller
Ruby 스크립트를 호출하는 bash 스크립트가 있습니다 foo
.
푸콜러
/path/to/foo
그 안에서 foo
경로를 얻고 싶습니다 foocaller
. 다음과 같은이 제안, 이를 수행하려면 다음 코드를 입력합니다.
부자
#!/usr/bin/env ruby
puts File.read("/proc/#{Process.ppid}/cmdline")
내가 실행할 때 :
$ bash foocaller
그러면 내가 원하는 것을 얻습니다.
bash^@/path/to/foocaller
하지만 직접 전화하면 foocaller
:
$ foocaller
그러면 나는 이것을 얻습니다:
/bin/bash^@--noediting^@-i
경로를 표시하지 않습니다 foocaller
. 을 사용하지 않고 foocaller
직접 호출하여 경로를 얻으려면 어떻게 해야 합니까 ?foocaller
bash
답변1
많은 쉘은 동일한 프로세스에서 명령을 실행하여 스크립트의 마지막 명령을 최적화합니다.
$ sh -c 'ps
ps'
PID TTY TIME CMD
32673 pts/3 00:00:00 zsh
32696 pts/3 00:00:00 sh
32697 pts/3 00:00:00 ps
PID TTY TIME CMD
32673 pts/3 00:00:00 zsh
32696 pts/3 00:00:00 ps
두 번째 프로세스가 ps
원래 실행된 프로세스 sh
(32696)에서 어떻게 실행되는지 확인하고 그 상위 프로세스는 (제 경우에는 대화형 셸) sh
의 상위 프로세스 입니다.zsh
다음 줄을 추가하면 이를 방지할 수 있습니다 exit
.
#! /bin/sh -
foo
exit
sh
foo
다 하고 난 뒤에도 설명할 것이 아직 남아 있기 때문에 같은 과정으로는 할 수 없습니다 . foo
그래서 foo
다른 프로세스에서 실행되고 기다립니다. 그런 다음 실행하십시오 exit
(이렇게 하면 동일한 종료 상태로 스크립트가 종료됩니다 foo
).
이제 여기에 프로세스를 저장할 수 있으므로 이는 이상적이지 않습니다.
foo
경로를 아는 더 좋은 방법 foocaller
은 다음과 같이 알려주는 것입니다.
#! /bin/sh -
CALLER=$0 foo
그런 다음 환경 변수를 foo
쿼리하여 CALLER
호출자에 대한 경로를 얻을 수 있습니다( import os;print(os.environ["CALLER"])
파이썬의 경우).