V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
redstar78kg
V2EX  ›  Linux

bash file.sh 解压

  •  
  •   redstar78kg · 2020-08-11 08:21:19 +08:00 via Android · 4078 次点击
    这是一个创建于 1563 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有几个文件,一个二进制文件,一个纯文本文件,三个 shell 脚本,分别是 run.sh stop.sh clean.sh

    需求,把这几个文件压缩为一个包,
    名字是 help.sh

    客户拿到文件后
    bash help.sh 即可当前目录解压
    而后当前目录运行 bash run.sh 即可运行。

    用什么方案能做这个 help.sh 压缩包呢?

    我之前用的是 tgz 。
    对方先 tar zxvf help.sh
    而后 cd help
    最后运行 bash run.sh
    但是,还是有人会搞错的。
    22 条回复    2020-09-10 00:02:28 +08:00
    ys0290
        1
    ys0290  
       2020-08-11 08:40:49 +08:00 via iPhone   ❤️ 1
    虽然说后缀不影响使用,但这 help.sh 名字也真是怪。别人为什么会出错?是一点 linux 基础都没有的那种吗?
    nosay
        2
    nosay  
       2020-08-11 08:52:51 +08:00
    唔,奇怪的问题...不过也可以试着这样做。

    zip -r help.sh ./* && echo '\n unzip help.sh' >> help.sh

    需要客户系统中预装 unzip,也可以写在 help.sh 中给客户装一下。
    soy
        3
    soy  
       2020-08-11 08:53:56 +08:00
    直接 Bazel 打包成一个.sar 可执行文件 用户也不用管解压啥的 直接运行
    https://docs.bazel.build/versions/3.4.0/be/shell.html#sh_binary
    Death
        4
    Death  
       2020-08-11 09:17:49 +08:00   ❤️ 3
    xuanbg
        5
    xuanbg  
       2020-08-11 11:14:30 +08:00
    不明白脚本为啥要压缩?很大吗?
    aloxaf
        6
    aloxaf  
       2020-08-11 11:38:00 +08:00
    直接把指定行后的内容喂给 gzip 就行了
    snowydec
        7
    snowydec  
       2020-08-11 11:39:04 +08:00
    进来解压的,告辞
    danyue9528
        8
    danyue9528  
       2020-08-11 11:47:02 +08:00
    还以为能解压呢,进来发现是真解压。。。
    告辞
    kiwi95
        9
    kiwi95  
       2020-08-11 11:56:47 +08:00 via iPhone
    二进制直接打到 shell 里面,有的安装包就是这样做的
    msg7086
        10
    msg7086  
       2020-08-11 13:05:48 +08:00
    你把解压缩代码写在 sh 里啊,然后从脚本尾部把压缩包提取出来解压不就好了。
    redstar78kg
        11
    redstar78kg  
    OP
       2020-08-11 18:10:32 +08:00 via Android
    多谢各位指点。

    我原来写
    tar zxvf xxx.tgz
    发现用户那边容易搞错。
    你很难想象,对方会大小写不分,随意加空格或者不打空格。

    所以,寻求更为简单的策略。
    尽量让对方,bash 一下就搞定了。

    再次感谢诸位指点。
    redstar78kg
        12
    redstar78kg  
    OP
       2020-08-11 18:10:55 +08:00 via Android
    @Death 多谢。
    dorothyREN
        13
    dorothyREN  
       2020-08-11 18:26:39 +08:00
    一个脚本一个 function 不就行了吗
    ivan_wl
        14
    ivan_wl  
       2020-08-11 21:24:38 +08:00
    xuboying
        15
    xuboying  
       2020-08-11 21:30:12 +08:00
    文档这么写:
    tar 空格 zxvfk 空格 xxx.tgz 请注意英文字母为全小写,不要开启中文输入法!


    对方是真心不会还是故意刁难你啊
    liberty1900
        16
    liberty1900  
       2020-08-11 23:24:32 +08:00 via Android
    二进制是 executable 吗,如果是,直接在生成这个 executable 的时候包含文本信息,stop, run, clean 就可以以参数的形式来执行。比如 nginx 就是启动 nginx, nginx -s stop 就是停止 nginx
    liberty1900
        17
    liberty1900  
       2020-08-11 23:30:14 +08:00 via Android
    更直接的方式是直接让用户选,假设 executable 叫 dosth, 用户直接输入 dosth, 然后提示 "您想干嘛呢"
    1. 运行 dosth
    2. 终止运行 dosth
    3. Clean
    当然如果 dosth 已经在运行要提示用户,而且不提供 1 选项; 没有运行不提供 2 选项
    MartinWu
        18
    MartinWu  
       2020-08-12 00:23:22 +08:00
    ```
    echo '#!/usr/bin/env bash'"\necho \"$(tar -cf - binfile testfile run.sh start.sh stop.sh | base64 )\" | base64 -d | tar -xf -" > help.sh; chmod +x help.sh
    ```

    这样生成的 help.sh 就是你要的了。
    abbottcn
        19
    abbottcn  
       2020-08-12 16:30:59 +08:00
    我曾经写了一个 CentOS 的配置脚本,最后一部分是:

    ### disable GUI
    echo -e "Enable GUI or no GUI? y/n"
    echo -e "Please input y or n"
    read check

    if [ ${check} = n ]
    then
    echo "Disable GUI"
    systemctl set-default multi-user.target

    elif [ ${check} = y ]
    then
    echo "enable GUI"
    systemctl set-default graphical.target
    fi

    用户看到的信息是:
    Enable GUI or no GUI? y/n
    Please input y or n

    然后,对方拍屏幕照片给我,大哥,下一步怎么弄?
    你让我怎么回复?
    abbottcn
        20
    abbottcn  
       2020-08-12 16:35:09 +08:00
    补充一下:
    我碰到的情形是,
    对方基本上使用 Linux 服务器做计算模拟,基本是英文 4 级、6 级分数还不错的在读硕士、博士研究生。
    需要我协助他们部署好 Linux 系统平台和专业软件。
    他们只负责用专业软件做专业事情,并不晓得什么 Linux 基础之类的事情。
    byzf
        21
    byzf  
       2020-08-12 19:04:19 +08:00
    tail -c 1234567 "/path/to/script.sh" > /tmp/your/temp.tar.gz 2> /dev/null
    gnuzip -xzf /tmp/your/temp.tar.gz

    打包的时候把 tar.gz 输出到 script.sh 后面.

    需求很常见, atlassian 的安装包都是这样的.
    shequ2046
        22
    shequ2046  
       2020-09-10 00:02:28 +08:00
    。。。直接把 binary file 存在 sh 里就是业内最标准的做法了。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:06 · PVG 07:06 · LAX 15:06 · JFK 18:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.