他のシェルスクリプトによって起動されたシェルスクリプトから「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/。どうやって入手できますpwdscriptx.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。他の人が起動しているので、変数のPIDscriptx.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 -

...最初に、最後のバックグラウンドプロセスの現在の作業ディレクトリに変更して印刷し、現在のシェルの以前の現在の作業ディレクトリに戻して印刷します。

関連情報