스크립트에서 상위 경로 가져오기

스크립트에서 상위 경로 가져오기

foocallerRuby 스크립트를 호출하는 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직접 호출하여 경로를 얻으려면 어떻게 해야 합니까 ?foocallerbash

답변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

shfoo다 하고 난 뒤에도 설명할 것이 아직 남아 있기 때문에 같은 과정으로는 할 수 없습니다 . foo그래서 foo다른 프로세스에서 실행되고 기다립니다. 그런 다음 실행하십시오 exit(이렇게 하면 동일한 종료 상태로 스크립트가 종료됩니다 foo).

이제 여기에 프로세스를 저장할 수 있으므로 이는 이상적이지 않습니다.

foo경로를 아는 더 좋은 방법 foocaller은 다음과 같이 알려주는 것입니다.

#! /bin/sh -
CALLER=$0 foo

그런 다음 환경 변수를 foo쿼리하여 CALLER호출자에 대한 경로를 얻을 수 있습니다( import os;print(os.environ["CALLER"])파이썬의 경우).

관련 정보