给定的脚本如何在 /usr/local/bin/ 中生成可执行文件

给定的脚本如何在 /usr/local/bin/ 中生成可执行文件

在做项目的时候,我发现了一个我完全搞不懂的脚本。你能帮我理解这个脚本吗?请一步一步解释一下这个脚本。

脚本

if ! [ -f /usr/local/bin/XXX -a -f /usr/local/bin/YYY -a -f /usr/local/bin/ZZZ ]
then
    if [ "`uname`" = "Linux" ]
    then
        UUDECODE="uudecode -o /dev/stdout"
    else
        UUDECODE="uudecode -p"
    fi
    cat $0 | awk 'printme == "1" {print} /^DATA BEGINS HERE/ {printme = "1"}' | ${UUDECODE} | (cd /usr/local/bin ; sudo tar xzf - --unlink)
    sudo chmod AAAA /usr/local/bin/XXX /usr/local/bin/YYY
fi

到目前为止我的理解

  1. 该脚本检查 /usr/local/bin 中是否存在 XXX 、 YYY 、 ZZZ 。
  2. 如果不是,则进入 if 的主体。
  3. 如果当前操作系统是 Linux,那么它会
  4. 但后来我就不明白了。

奇怪的是,运行此脚本后,这三个可执行文件位于 /usr/local/bin 中。请逐行解释下面的脚本。

我提到的一件事是,在脚本末尾,有一些不可读的数据,从“数据从这里开始”开始。该脚本是否将此数据复制到 /usr/local/bin ?

答案1

如果是Linux,则将UUDECODE设置为调用命令的一种形式uudecode,如果不是,则设置另一种形式。它不是标准的,因此如何调用它会有所不同。如果你问我的话,我不太聪明。

行的开头cat $0才真正起作用。$0是正在运行的进程的名称,即当前脚本的名称。同样,大部分情况下会起作用,但可能会被愚弄。

脚本的内容通过管道传输到awk脚本,脚本将其后的所有文本复制DATA BEGINS HERE到其输出,该输出通过管道传输到uudecode(之前设置的命令)。uudecode获取文本并生成它的二进制文件(在 HTTP 和其他协议流行之前, uuencode/uudecode用于将二进制文件作为文本传送),结果通过管道传输到“()”中的命令,该命令首先更改为/usr/local/bin然后解压输入与tar那里。第--unlink一个删除任何现有文件。

这是从哪里来的?

相关内容