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

Shell 调用 tar 打包总是报错!

  •  
  •   jalena · 2015-12-09 10:26:16 +08:00 · 3588 次点击
    这是一个创建于 3270 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在折腾一个脚本,但是总遇到 一个报错!

    脚本在 https://github.com/jalena/vps-backup/blob/master/backup.sh (错误地方在#97 )

    每次执行的时候以下代码就包 tar 没有 e 参数!!

    function configuration(){
    nginxcnf='find / -name nginx.conf |grep -v root'
    tar cPf nginx
    $(date +%Y%m%d).tar.gz $NGINXPATH
    echo -e "package nginx
    $(date +%Y%m%d).tar.gz success!"
    tar rPf nginx_$(date +%Y%m%d).tar.gz $nginx_cnf
    echo -e "Additional file successfully"
    }

    求大神解答写

    第 1 条附言  ·  2016-01-23 12:46:28 +08:00
    configuration(){
        tar cPf nginx_$current_date.tar.gz $NGINX_PATH
        echo -e "package nginx_$current_date.tar.gz success!"
        find / -name nginx.conf |grep -v root | xargs tar rPf nginx_$current_date.tar.gz
        echo -e "Additional file successfully"
    }
    
    第 2 条附言  ·  2016-01-23 12:50:42 +08:00

    原来是因为直接使用 find 获取路径,没有将获取的路径转义..包含了空格 /...命令就变成

    tar rPf nginx_$(date +%Y%m%d).tar.gz `find / -name nginx.conf |grep -v root'
    

    当然这个语法就是错误的~~~

    16 条回复    2016-01-23 12:51:21 +08:00
    ooxxcc
        1
    ooxxcc  
       2015-12-09 10:36:15 +08:00
    错误提示都不贴出来……
    ooxxcc
        2
    ooxxcc  
       2015-12-09 10:37:27 +08:00
    两个 tar 命令前面加 echo ,看看实际执行的指令是什么
    pright
        3
    pright  
       2015-12-09 10:47:11 +08:00
    nginxcnf=`find / -name nginx.conf |grep -v root`
    是`不是'
    congeec
        4
    congeec  
       2015-12-09 10:48:04 +08:00
    看了下,你 shell 用的很不规范。即使这个地方修复了其他地方肯定也有 bug 。用 shellcheck 过一边吧
    SpicyCat
        5
    SpicyCat  
       2015-12-09 11:56:30 +08:00
    set -ex 或者 set -x 看看详细执行信息。

    打包是 tar zcPf 吧?你代码在另外一个地方用的是 tar zcPf ,为什么这里用 tar cPf
    Arthur2e5
        6
    Arthur2e5  
       2015-12-20 13:48:49 +08:00
    能不能先学学 markdown ……
    @SpicyCat z 只是要求 gzip 而已。
    @pright 干脆不要用反引号用$( ) 大法……
    @congeec shellcheck 目前为止还不会提醒 function xxx 这种坏习惯。
    congeec
        7
    congeec  
       2015-12-20 14:54:50 +08:00
    @Arthur2e5 funciton 啥的就是看起来碍不碍眼。关键是楼主变量没有加引号噗哈哈。
    ``` shell
    var=
    rm -rf /usr/local/$var
    ```
    然后 /usr/local 目录就没了😆😆
    JerningChan
        8
    JerningChan  
       2015-12-21 11:07:14 +08:00
    你的$nginx_cnf?是哪个变量呀?
    你帖出来的,就看见个
    nginxcnf='find / -name nginx.conf |grep -v root'
    你确定你未写错变量?
    Arthur2e5
        9
    Arthur2e5  
       2015-12-21 17:00:16 +08:00
    @congeec function 并不是碍不碍眼的问题。写顺了写进简陋一点但还算 POSIX 的 shell 例如 dash 和 busybox ash 试试喏。这种最容易避免的 bashism 干脆从最早就不要有。

    * 当然,可以养成 `alias function=` 的习惯……

    然后管你加不加引号你那个 var 是空的的时候都得死啊。
    congeec
        10
    congeec  
       2015-12-21 18:12:09 +08:00
    @Arthur2e5 你说的对哦
    jalena
        11
    jalena  
    OP
       2016-01-23 11:56:38 +08:00
    @pright 找到问题了,,,,,就是 nginxcnf=`find / -name nginx.conf |grep -v root` ~~~~~~
    jalena
        12
    jalena  
    OP
       2016-01-23 11:58:19 +08:00
    @congeec function 是故意去掉了,母的技术让他看起来更小..简写也不影响功能!
    jalena
        13
    jalena  
    OP
       2016-01-23 12:03:48 +08:00
    @JerningChan 变量没错,,只是这个输出的东西和打包用的路径不符,所以报错..用通道就好了..

    find / -name nginx.conf |grep -v root | xargs tar rPf nginx_$current_date.tar.gz
    jalena
        14
    jalena  
    OP
       2016-01-23 12:07:37 +08:00
    @Arthur2e5 加不加 function 还是个人喜好问题吧,~
    jalena
        15
    jalena  
    OP
       2016-01-23 12:11:24 +08:00
    @SpicyCat cPf...

    c 追加
    P 按原始路径!
    jalena
        16
    jalena  
    OP
       2016-01-23 12:51:21 +08:00
    @Arthur2e5 刚开始来 V2EX 哈,我还不知道支持这个语法呢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5129 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:16 · PVG 09:16 · LAX 17:16 · JFK 20:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.