在做项目的时候,我发现了一个我完全搞不懂的脚本。你能帮我理解这个脚本吗?请一步一步解释一下这个脚本。
脚本
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
到目前为止我的理解
- 该脚本检查 /usr/local/bin 中是否存在 XXX 、 YYY 、 ZZZ 。
- 如果不是,则进入 if 的主体。
- 如果当前操作系统是 Linux,那么它会
- 但后来我就不明白了。
奇怪的是,运行此脚本后,这三个可执行文件位于 /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
一个删除任何现有文件。
这是从哪里来的?