如何在由另一个 shell 脚本启动的 shell 脚本中获取“pwd”

如何在由另一个 shell 脚本启动的 shell 脚本中获取“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/我显示了pwdscriptx.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.shscript2.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。由于scriptx.sh正在启动其他人,因此他们将可以访问变量scriptx.sh中的 PID $PPID。在 Linux 中,每个正在运行的进程都有一个指向其当前工作目录的链接/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在 shell 参数中所做的$!那样,并且您可以使用 获取另一个进程的 PID jobs -p,那么,在 Linux 系统上,您可以这样做:

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

...这将首先更改为最后一个后台进程的当前工作目录,然后打印它,然后更改回当前 shell 的上一个当前工作目录,并打印它。

相关内容