如何编写脚本来更新库的符号链接(多个文件)

如何编写脚本来更新库的符号链接(多个文件)

想咨询如何为多个文件编写符号链接?就像编写 bash 脚本一样

基本上该文件是gstreamer库,该库就是这样的模式。一个例子如下

libgstadaptivedemux-1.0.so      should link to  libgstadaptivedemux-1.0.so.0                                                                                                                    
libgstadaptivedemux-1.0.so.0    should link to  libgstadaptivedemux-1.0.so.0.1806.0                                                                                                                  
libgstadaptivedemux-1.0.so.0.1404.0  (the old library)                                                                                                            
libgstadaptivedemux-1.0.so.0.1806.0   (the new library)

我尝试做类似以下的事情

ln -sf libgst*.0 libgst*
ln -sf libgst*.0.1806.0  libgst*.0

但总是失败,说 libgst***.0.1806.0 不是目录。我哪里出错了?

谢谢

答案1

ln -sf libgst*.0 libgst*

扩展到(在你的情况下)

ln -sf libgstadaptivedemux-1.0.so.0 libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0 libgstadaptivedemux-1.0.so libgstadaptivedemux-1.0.so.0 libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0

因为libgst*.0匹配libgstadaptivedemux-1.0.so.0libgstadaptivedemux-1.0.so.0.1404.0libgstadaptivedemux-1.0.so.0.1806.0,而libgst*匹配所有四个文件。

对于这样的多个参数,ln预计最后一个参数是一个目录;这个变体的目的ln,与n参数在哪里n> 2,是创建所有名称文件的链接(非选项参数1到n-1) 在给定目录中(参数n)。

假设你总是替换现有链接,从不创建新链接,您的第一个命令可以替换为

ln -sf libgst*.so.0 libgst*.so

(但如果这两个链接存在,则不需要该命令)。

你的第二个命令应该替换为

ldconfig

这将正确更新链接和库缓存(这是动态链接器真正使用的)。

答案2

请理解扩展的作用:它用所有匹配的现有文件名*替换单词 ith the ,因此将变成*ln -sf libgst*.0 libgst*

ln -sf libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0 libgstadaptivedemux-1.0.so.0.1404.0 libgstadaptivedemux-1.0.so.0.1806.0
       ´----------------------------------v----------------------------------´ `----------------------------------v----------------------------------´
                                  matching libgst*.0                                                      matching libgst*

在您的情况下,两个 glob 都扩展为相同的两个文件(或者另外扩展为已存在的匹配符号链接),因此您必须将文件名添加到命令中ln。在这种情况下,ln期望姓氏是一个目录,所有符号链接都应放置在其中。这就是您收到此错误消息的原因。

但您需要一些不同的东西:经典形式ln -s file symlink,一次创建一个链接。如果您不想单独编写它,则需要循环,如果有类似的逻辑

for file in libgst*1806.0; do ln -sf "$file" "${file%.1806.0}; done

相关内容