linux shell 获取文件绝对路径.

要得到正在执行的程序/脚本自身所存放的绝对路径,在 PHP 里面可以用 dirname(realpath(__FILE__)) ; C# 则有 System.Windows.Forms.Application.StartupPath ; java 似乎没有什么比较直接的方法,只能利用 CodeSource 来间接获取 。而在 linux shell 脚本里面如果想得到当前脚本文件存放的绝对路径,也没有太现成的命令可以调用,不过可以通过下面的语句来获取:

baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)
echo "full path to currently executed script is : ${baseDirForScriptSelf}"

虽说大部分情况下我们并不需要这样的绝对路径来完成工作;但如果要把多个脚本、数据文件等内容打包作为一个整体来交付别人使用,又希望不论用户拷贝到哪个目录下执行脚本都能够正确的找到这个包里面的其他内容的话,用这样的脚本来自动定位包的根目录应该是个比较鲁棒的做法。

这个方法确实比用pwd高明太多了。
但是把他用在嵌套脚本时就会发生问题。例如我在脚本a里面调用脚本b。
脚本b:
baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)
echo $baseDirForScriptSelf
脚本a:
. b.sh
最后输出的结果是脚本a的绝对路径,而不是脚本b的绝对路径。我发现问题出在$0这个地方。这个时候的$0是脚本a的路径名称。


或者,test=`dirname $0`
echo $test
也可达到目的.
<think>好的,用户想了解如何在Linux shell获取指定PID的文件路径。我需要先回忆一下相关的方法,确保信息准确。首先,我知道每个进程在/proc目录下都有对应的子目录,PID作为子目录名。进入这个目录后,里面的文件符号链接可能包含所需的信息。 接下来,用户需要的是文件路径,通常指的是进程的可执行文件路径。这时候应该想到使用readlink命令来解析符号链接。具体来说,/proc/PID/exe这个符号链接指向的就是该进程对应的可执行文件路径。因此,使用readlink -f /proc/PID/exe应该可以得到绝对路径。 另外,有时候用户可能会混淆cwd和exe的区别。cwd是当前工作目录,而exe才是可执行文件的实际路径。所以需要明确用户的需求,确保给出正确的路径。不过根据问题描述,用户明确提到文件路径,应该是指可执行文件的位置,所以重点放在exe上。 还需要考虑如何获取PID。用户可能已经知道PID,但如果没有的话,可能需要结合ps或pgrep命令来查找进程的PID。例如,使用ps aux | grep 进程名或者pgrep 进程名来获取PID,然后再带入到前面的命令中。 此外,需要注意权限问题。如果用户没有足够的权限访问某个进程的信息,可能会遇到权限被拒绝的情况。此时可能需要使用sudo来提升权限,或者以root用户身份执行命令。 总结步骤的话,应该是先获取PID,然后使用readlink读取/proc/PID/exe的链接。给出具体的命令示例,例如替换PID为实际数值,或者组合命令一步到位。同时,提醒用户注意权限问题,以及不同Linux发行版之间可能的细微差异,但大多数情况下/proc目录结构是标准化的。 可能还需要检查是否存在其他方法,比如使用pwdx命令获取工作目录,但这可能不符合用户需求。或者使用lsof -p PID列出进程打开的文件,但这样信息较多,需要过滤。不过最直接的方法还是通过/proc/PID/exe。 最后,确保给出的命令正确,语法无误,用户能够直接复制使用,并附上解释,帮助理解每个步骤的作用。如果有必要,可以举一个例子,比如查找nginx进程的路径,这样更直观。</think>在 Linux 系统中获取指定 PID 的进程文件路径,可以通过以下步骤实现: ### 方法一:通过 `/proc` 目录查询 1. **定位进程的可执行文件路径** 使用 `readlink` 命令解析符号链接: ```bash readlink -f /proc/[PID]/exe ``` 将 `[PID]` 替换为实际进程号,例如: ```bash readlink -f /proc/1234/exe ``` 2. **查看进程的当前工作目录**(可选) 若需获取进程运行时的工作目录: ```bash readlink -f /proc/[PID]/cwd ``` ### 方法二:组合命令一步查询 ```bash ps -p [PID] -o args | tail -n 1 ``` 此命令会显示进程的完整启动命令(包含路径),但需注意: - 若进程通过相对路径启动,显示结果可能不含绝对路径 - 建议优先使用 `/proc` 方法 ### 方法三:通过 `lsof` 命令查询 ```bash lsof -p [PID] | grep ' txt ' ``` 输出结果中的文件路径即为可执行文件位置。 ### 示例演示 假设要查找 PID 为 `5678` 的进程文件路径: ```bash $ readlink -f /proc/5678/exe /usr/bin/python3.9 ``` ### 注意事项 1. 需要 **root 权限**才能查看其他用户的进程信息 2. 如果进程已结束,`/proc/[PID]` 目录将不存在 3. 僵尸进程(Zombie)可能无法获取有效路径 ### 扩展技巧 若不知道 PID,可先通过 `pgrep` 查找进程号: ```bash pgrep -f "进程名关键词" ``` 再通过管道传递结果: ```bash readlink -f /proc/$(pgrep -f nginx)/exe ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值