다른 쉘 스크립트에 의해 시작된 쉘 스크립트에서 "pwd"를 얻는 방법

다른 쉘 스크립트에 의해 시작된 쉘 스크립트에서 "pwd"를 얻는 방법

startScript.sh에 있습니다/root/script/startScript.sh

script1.sh에 있습니다/root/script/test/script1.sh

script2.sh 에 있습니다/root/script/test/script2.sh

startScript.sh아래처럼 보인다

#!/bin/bash
#some code!
sh `pwd`/test/script1.sh 2>&1 &
sh `pwd`/test/script2.sh 2>&1 &
#some code

script2.shscript1.sh다음과 같이

#!/bin/bash
> `pwd`/process_ids.txt
while true;do
  echo "The Process: `ps`" >> `pwd`/process_ids.txt
  #some code to parse the process, etc. and echo it
done

일어나는 일은 process_ids.txt파일이 생성되는 것 입니다 /root/script. 하지만 그 근거 scriptx.shpwd. /root/scripts/test/보여줬는데 pwd보여 scriptx.sh지네요 /root/script/. 어떻게 얻을 수 pwd있나요 scriptx.sh?

답변1

test/생성하려는 파일의 경로에 추가하면 어떨까요?

#!/bin/bash
> `pwd`/test/process_ids.txt
while true;do
  echo "The Process: `ps`" >> `pwd`/test/process_ids.txt
  #some code to parse the process, etc. and echo it
done

답변2

가장 쉬운 방법은 이를 스크립트 1과 2에 매개변수로 전달하는 것입니다. 따라서 scriptx.sh다음과 같이 수정되었습니다(그런데 $PWD외부 명령을 실행할 이유가 없습니다).

#!/bin/bash
#some code!
sh "$PWD"/test/script1.sh "$PWD" 2>&1 &
sh "$PWD"/test/script2.sh "$PWD" 2>&1 &
#some code

그리고 script1.sh그리고 script2.sh:

#!/bin/bash

dir="$1"
> "$dir"/process_ids.txt
while true;do
  echo "The Process: `ps`" >> "$dir"/process_ids.txt
  #some code to parse the process, etc. and echo it
done

보다 정교한 접근 방식은 파일 시스템에서 상위 스크립트의 PWD를 얻는 것입니다 /proc. 다른 사람들이 시작되고 있으므로 변수 의 PID scriptx.sh에 액세스할 수 있습니다 . Linux에서 실행 중인 각 프로세스에는 현재 작업 디렉터리에 대한 링크가 있습니다 . 따라서 동일하게 유지하고 다른 항목을 다음과 같이 수정할 수 있습니다.scriptx.sh$PPID/proc/PID/cwdscriptx.sh

#!/bin/bash

dir="$(readlink -f /proc/$PPID/cwd)"
> "$dir"/process_ids.txt
while true;do
  echo "The Process: `ps`" >> "$dir"/process_ids.txt
  #some code to parse the process, etc. and echo it
done

답변3

당신은 필요하지 않습니다얻다또는통과누구든지 무엇이든. 끝났습니다. 분기된 프로세스의 현재 작업 디렉터리는 상위 프로세스의 현재 작업 디렉터리입니다. 따라서 이러한 스크립트가 현재 디렉터리를 변경하지 않는 한, 만약 그렇다면 이것이 예상된 동작이거나 편집을 통해 수행을 방지해야 하는 작업인 경우 현재 작업 디렉터리는 모든 사람에게 동일하게 됩니다. 하지만 만약 있다면어떤 이유에서인지 차이가 ​​있고 출력이 ...

`pwd`

...똑같은 문제가 있고 똑같은 이유로 인해 어떤 징후로도 간주될 수 없습니다.

그러나 다른 프로세스에 대해 이러한 사항을 확인하고 싶고 다른 프로세스의 PID가 있는 경우( script2.sh쉘 인수에서 와 같이 $!)를 사용하여 다른 프로세스의 PID를 얻을 수 있으면jobs -p

cd -P /proc/"$!"/cwd;pwd;cd -

...먼저 마지막 백그라운드 프로세스의 현재 작업 디렉터리로 변경한 다음 인쇄한 다음 현재 셸의 이전 현재 작업 디렉터리로 다시 변경하여 인쇄합니다.

관련 정보