MacOS终端中通过脚本运行文件时如何获取文件完整路径
MacOS终端中通过脚本运行文件时如何获取文件完整路径
嘿,刚好碰到过类似需求!在macOS的Shell脚本里,想要实现Windows批处理中set path=%~dp1%~nx1的效果,获取传入文件的完整绝对路径,有几种实用的方法,我给你详细说说:
方法1:用realpath命令(推荐,简单直接)
如果你的macOS版本是10.13及以上,系统默认自带realpath命令,它可以直接把相对路径或文件名转换成完整的绝对路径。在脚本里这么写就行:
# 把传入的第一个文件参数转成完整路径,存到full_path变量里 full_path=$(realpath "$1")
比如你运行./your_script.sh test.txt,不管test.txt在当前目录还是其他地方,full_path都会存储它的完整绝对路径(比如/Users/yourname/Documents/test.txt)。
方法2:兼容旧版系统的手动拼接方式
要是你的系统比较老,没有realpath,可以用目录定位+文件名拼接的方式,原理和Windows批处理拆分路径的思路类似:
# 先获取文件所在目录的绝对路径 file_dir=$(cd "$(dirname "$1")" && pwd) # 再获取文件名(带扩展名) file_name="${1##*/}" # 拼接成完整路径 full_path="$file_dir/$file_name"
这里dirname "$1"用来提取文件的目录部分,cd到该目录后用pwd拿到绝对路径;${1##*/}是Shell的参数扩展,用来提取最后一个/后面的文件名部分,和Windows里的%~nx1作用一样。
举个完整的脚本例子
把上面的逻辑写成完整脚本,还能加个参数检查,避免用户没传文件:
#!/bin/bash # 检查是否传入了文件参数 if [ -z "$1" ]; then echo "请传入一个文件作为参数哦!比如:./your_script.sh your_file.txt" exit 1 fi # 用realpath获取完整路径 full_path=$(realpath "$1") echo "文件的完整路径是:$full_path"
这样就能完美替代Windows批处理里的那条命令啦,把刚打开的文件完整路径存到变量里,后续想用直接调用$full_path就行~
备注:内容来源于stack exchange,提问作者David Kohout




