为什么这个简单的 bash 脚本会毁掉我的电脑?

为什么这个简单的 bash 脚本会毁掉我的电脑?

我的一个看似无害的脚本发生了一些奇怪的事情。我需要将一系列文件复制到系统中的某些位置,并且我有以下脚本来执行此操作。

#!/bin/bash

# Get all the files from the file
LINES=$(cat Release-Nodejs/dependencies.txt)

# Copy each file to its location as indicated in the file
for LINE in ${LINES}
do
    LIBRARY=$(basename ${LINE})
    LIBRARY=Release-Nodejs/${LIBRARY}
    LIB_PATH=$(dirname ${LINE})
    echo -e "Copying \e[38;5;10m${LIBRARY}\e[0m to \e[38;5;11m${LIB_PATH}\e[0m"
    cp ${LIBRARY} ${LIB_PATH}
done

该脚本正在从文件中获取文件和位置,dependencies.txt其内容为:

/usr/lib/x86_64-linux-gnu/libnode.so.72
/lib/x86_64-linux-gnu/libgcc_s.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1
/usr/lib/x86_64-linux-gnu/libbrotlidec.so.1
/usr/lib/x86_64-linux-gnu/libbrotlienc.so.1
/usr/lib/x86_64-linux-gnu/libcares.so.2
/usr/lib/x86_64-linux-gnu/libnghttp2.so.14
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
/usr/lib/x86_64-linux-gnu/libssl.so.1.1
/usr/lib/x86_64-linux-gnu/libicui18n.so.67
/usr/lib/x86_64-linux-gnu/libicuuc.so.67
/lib/x86_64-linux-gnu/libdl.so.2
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/lib/x86_64-linux-gnu/libm.so.6
/usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1
/usr/lib/x86_64-linux-gnu/libicudata.so.67

如果我注释掉该cp ${LIBRARY} ${LIB_PATH}行,我会得到:

脚本输出

所以我知道我正确获取了文件名和路径。当我取消注释该cp ${LIBRARY} ${LIB_PATH}行并运行脚本时,sudo脚本会破坏我的系统(顺便说一句,这是无害的,因为我正在虚拟机上测试它)。执行此操作时,屏幕会变黑,我必须强制关闭虚拟机窗口。然后,当我尝试再次运行虚拟机时,我得到以下信息:

死亡系统

我必须完全重新安装 UBUNTU。

我想知道为什么会发生这种情况,因为我可以在命令行上为每个文件手动执行,cp并且没有发生任何不好的事情,文件只是被复制到目的地。


编辑:

正如评论之一和XY问题,我试图解决的问题是,我正在我的机器上创建一个本机nodejs模块,该模块具有node v12.18.1并且应在具有的机器上使用,node v 10.19.0并且我绝对无法更新目标机器上的节点版本或安装其他包含依赖项的包。

当我执行时ldd mymodule.node我得到:

linux-vdso.so.1 (0x00007ffe878c6000)
libnode.so.72 => /usr/lib/x86_64-linux-gnu/libnode.so.72 (0x00007f9bd34fb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9bd34e0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9bd34be000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9bd32d4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9bd5b1e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f9bd32b7000)
libbrotlidec.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007f9bd32a9000)
libbrotlienc.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlienc.so.1 (0x00007f9bd3215000)
libcares.so.2 => /usr/lib/x86_64-linux-gnu/libcares.so.2 (0x00007f9bd31fe000)
libnghttp2.so.14 => /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007f9bd31d2000)
libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f9bd2ef5000)
libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f9bd2e61000)
libicui18n.so.67 => /usr/lib/x86_64-linux-gnu/libicui18n.so.67 (0x00007f9bd2b4f000)
libicuuc.so.67 => /usr/lib/x86_64-linux-gnu/libicuuc.so.67 (0x00007f9bd2961000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9bd295b000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9bd277a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9bd262b000)
libbrotlicommon.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007f9bd2608000)
libicudata.so.67 => /usr/lib/x86_64-linux-gnu/libicudata.so.67 (0x00007f9bd0aed000)

这就是为什么我试图在这个问题上做我想做的事情。所以这里真正的问题是;如何将这些依赖项与.node模块一起包含在内,以便我可以部署它而无需更新目标上的任何内容?

我更愿意将所有这些链接到模块中,并且只有一个 .node 文件包含所有内容并且不依赖于系统库,但我认为这是不可能的,或者是吗?

答案1

您可以再试一次,除了创建目录“mkdir -p /usr/local/lib/nodejs”,并将 LIBPATH 设置为“export LIBPATH=/usr/local/lib/nodejs/”。不过,我强烈建议您在开始之前阅读如何在 Linux 上安装 Nodejs。例如,请参阅“https://github.com/nodejs/help/wiki/Installation#how-to-install-nodejs-via-binary-archive-on-linux” - 它在“/usr/local”中进行安装/lib/nodejs”。创建目录后,您需要做的唯一繁重工作是下载二进制文件并将其解压到目录“/usr/local/lib/nodejs”中

相关内容