需要脚本说明

时间:2018-09-16 05:34:18

标签: terminal sh

我从别人的项目中找到了以下脚本。

有人可以解释下面的脚本做什么吗?

for libtocopy in $LIBS_TO_COPY ; do 
    libfile=`ldd bin/foo.so | grep lib${libtocopy} | cut -d' ' -f 3`
    if [ "x$libfile" != "x" ] ; then 
        #echo "$libtocopy : copying $libfile in libs"
        cp $libfile foo/libs 
    fi
    done

1 个答案:

答案 0 :(得分:1)

简而言之,脚本将从脚本中提到的bin/foo.so二进制文件中提取动态选择的共享库。

驱动整个脚本的命令是ldd。这将解决并打印可执行文件的任何动态依赖关系。

例如这是一个示例输出(在方便的Raspberry Pi上,但是输出兼容):

ldd /bin/grep
        linux-vdso.so.1 (0x7ef36000)
        /usr/lib/arm-linux-gnueabihf/libarmmem.so (0x76f8b000)
        libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0x76efe000)
        libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x76eeb000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76dac000)
        /lib/ld-linux-armhf.so.3 (0x76fa1000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76d83000)

因此,对于LIBS_TO_COPY变量中的每个名称(例如,上面最后一行的pthread),它将找到带有lib前缀的行(例如libpthread)。

每条匹配的行都通过管道传输到cut中,echo将选择该行的第三个字段(使用空格作为分隔符),即该库的解析路径。

然后将这些已解决的依赖项复制到所选目录中。

例如,将脚本中的bin/foo.so取消注释,并将/bin/grep切换为$ export LIBS_TO_COPY='pthread c dl' $ bash libextract.bash pthread : copying /lib/arm-linux-gnueabihf/libpthread.so.0 in libs c : copying /lib/arm-linux-gnueabihf/libc.so.6 in libs dl : copying /lib/arm-linux-gnueabihf/libdl.so.2 in libs

bash

sh /* The method takes in a page index and creates the next content view controller. If the controller can be created, we call the built-in setViewControllers method and navigate to the next view controller.*/ func forward(index: Int) { if let nextViewController = contentViewController(at: index + 1) { setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil) } } 两个shell给出相同的输出)。