0

我编写了一个相当广泛的 BASH 脚本来执行一堆任务。在此主脚本中调用其他脚本。打包此脚本以便其他用户可以使用基本脚本的最佳方法是什么。

我想到了一些方法: 将所有依赖项与主脚本一起发送:这可能会遇到其他用户不了解如何将脚本放入其 PATH 但很容易发送的问题。

将所有脚本的内容作为函数添加到主服务器:这需要进行大量重写,以便可以访问所有脚本。然后,如果我将来进行更改,我很难让 Master 与子脚本保持同步。

谁能想到另一种打包一组脚本(和可执行文件)的方法,以便接收它的最终用户可以轻松地以最少的麻烦运行包?

4

2 回答 2

1

您可以PATH在主脚本的开头进行修改,因为听起来用户不需要手动运行依赖项(即,在主脚本之外)。

于 2012-07-26T17:37:35.167 回答
0

您可以使用此方法在脚本中打包很多东西。base-64 文本来自对包中所有文件的 tar.gz 文件进行 uuencode 编码。此示例打包了 3 个脚本。

#!/bin/bash
pushd /tmp && mkdir stuff$$here  && pushd stuff$$here
if [[ $? != 0 ]]; then
    echo "can't make /tmp/stuff$$here"
    exit 1
fi
a=$(cat <<'@@@'
H4sIABWJEVAAA+3TsQ6CMBRA0c58RcVdWin0e9rGBBY1FOPvW2BxQScQ4j1p8pLXDl2uO8VGLEwl1lbD
1LZS73NSGqHPSpkynXrYW1vWQqqlPzZ4xN51UooQnh/ffbvfqeOh8O218C422SU0N5nH0LX3Xro8+/Xf
sDy/tf6tHvs3mv7XMNu/p/9/EDbWv1FT/2lF/yuY7T/QPwAAAAAAAAAAAADsyQsw5pIDACgAAA==
@@@
)
st=0
for (( i=0; i<"${#a}"; i++ ))
do
 x=${a:$i:1}
 in=$(($(expr index \
 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' "\\$x")-1))
 if [ $in -ge 0 ]; then case $st in
  0 ) out=$(($in<<2)); st=3;;
  1 ) out=$(($out|$in)); 
    printf \\$(printf '%03o' $(($out&255)) ) ; st=0 ;;
  2 ) out=$(($out+($in>>2))); 
    printf \\$(printf '%03o' $(($out&255)) ) ;
    st=0; out=$(($in<<6)); st=1;;
  * ) out=$(($out+($in>>4))); 
    printf \\$(printf '%03o' $(($out&255)) ) ;
    st=0; out=$(($in<<4)); st=2;;
  esac fi
done | (gzip -d |tar -xf - )
./a.sh
./b.sh
./c.sh
rm a.sh b.sh c.sh
popd
rmdir stuff$$here
popd
exit
于 2012-07-26T18:29:46.117 回答