我正在尝试编写一组TCL脚本,这些脚本有助于为一组不在标准LD_LIBRARY_PATH
中的库作为支持解决方案的一部分设置用户的环境。
由于系统在我可以安装的方面相当稀疏,我实际上无法访问任何TCL扩展,并且我试图尽可能地在基本TCL中执行此操作。作为一种语言,我对TCL也比较陌生。
我想要做的是搜索目录结构并找到其中包含.so
和.a
个文件的目录,构建这些目录的列表,并最终将它们添加到用户的$LD_LIBRARY_PATH
变量。
如果我在shell中执行此操作,我只需使用find这样的内容:
find /dir -type f \( -name "*.so" -o -name "*.a" \) | awk -F/ 'sub(FS $NF,x)' | sort -u
我可以对路径进行硬编码,但我们需要一组可以管理多个不同应用程序的脚本。
非常感谢任何想法。
答案 0 :(得分:0)
package require fileutil
set filenames [::fileutil::findByPattern /dir -glob {*.so *.a}]
foreach filename $filenames {
if {[file isfile $filename]} {
set dirs([file dirname $filename]) 1
}
}
puts [array names dirs]
如果您想使用此功能,但无法安装某些内容,则可以执行这些步骤并将其添加到您的代码中(使用相应的归因) - http://core.tcl.tk/tcllib/dir?ci=63d99a74f4600441&name=modules/fileutil
否则,只需调用系统的find
命令并解析输出(假设您的文件名不包含换行符)。
set filenames [split [exec find /dir -type f ( -name *.so -o -name *.a )] \n]
提取唯一目录的循环类似。作为附带好处,find
调用实际上更容易阅读,因为您不必转义所有对shell特殊的字符。