Mac OS X:如何在脚本中获取otool结果并修改dylib搜索路径?
如何将
otool -L的输出存入Shell脚本变量 嘿,这个需求在macOS下处理动态库依赖时太常见了!我来给你一步步讲清楚怎么把otool -L的结果存到脚本变量里,顺便结合你要用的install_name_tool给点实用技巧。
基础:把命令输出存入变量
在Shell脚本里,命令替换是干这个的标准方法——用$(...)把otool -L命令包起来,直接赋值给变量就行:
# 把my.dylib的所有依赖路径信息存入dylib_deps变量 dylib_deps=$(otool -L my.dylib)
你也能看到有人用老式的反引号`...`写法,比如dylib_deps=otool -L my.dylib``,不过更推荐$(...),它支持嵌套命令,可读性也更好。
验证变量里的内容
存完之后,要是想确认变量里的内容对不对,记得用双引号包裹变量输出,不然换行和空格会被合并成一堆:
# 完整输出所有内容,保留原格式 echo "$dylib_deps" # 或者用printf,输出更稳定 printf "%s\n" "$dylib_deps"
结合install_name_tool的实用进阶
既然你是要修改dylib的搜索路径,大概率不需要整个otool -L的输出,而是要提取某一个特定依赖的原路径。这时候可以用grep+awk来过滤:
# 提取my.dylib里依赖的libfoo.dylib的原路径 old_lib_path=$(otool -L my.dylib | grep "libfoo.dylib" | awk '{print $1}') # 然后直接用install_name_tool替换路径 install_name_tool -change "$old_lib_path" "/your/new/path/libfoo.dylib" my.dylib
避坑小技巧
- 如果你的dylib里有多个同名依赖,记得给
grep加-m 1参数只取第一个匹配项,避免变量里存了多行内容:old_lib_path=$(otool -L my.dylib | grep -m 1 "libfoo.dylib" | awk '{print $1}') - 要是路径里带空格,一定要用双引号把变量和路径包起来,否则Shell会把空格当成分隔符,导致命令执行失败。
内容的提问来源于stack exchange,提问作者ZedZip
相关产品推荐
相关产品推荐

