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.sh
script1.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.sh
はpwd
。/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
。他の人が起動しているので、変数のPIDscriptx.sh
にアクセスできます。 Linuxで実行されている各プロセスには、現在の作業ディレクトリへのリンクがあります。したがって、同じままで、他の項目を次のように変更できます。scriptx.sh
$PPID
/proc/PID/cwd
scriptx.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 -
...最初に、最後のバックグラウンドプロセスの現在の作業ディレクトリに変更して印刷し、現在のシェルの以前の現在の作業ディレクトリに戻して印刷します。