嵌套在函数内的管道命令末尾的连字符 (-) 被忽略吗?

嵌套在函数内的管道命令末尾的连字符 (-) 被忽略吗?

我使用 Ubuntu 16.04 (xenial) 和 Bash 4.3.48(1)。

基于斯蒂芬·基特的回答在本次会议中,我尝试运行以下命令作为名为 的函数的一部分imb()

mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip" -

我获取了该函数所在的文件imb()

source ~/functions.sh

功能

imb() {
    drt="/var/www/html"
    date="$(date +\%F-\%T)"
    mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip" - # Note the hyphen before this comment;
    zip -r "all_zipped-$date.zip" "$drt"/ -x "*/cache/*"
    rm -f "$drt/db-$date.zip"
}

我的问题

调用该函数失败并出现zip错误:

zip error: Nothing to do! (/var/www/html/db-2018-04-13-22:27:47.zip)

发生这种情况似乎是因为连字符不知何故被忽略了;我认为从以下内容来看:

type -a imb

其输出:

imb is a function

imb () {
    date="$(date +\%F-\%T)";
    mysqldump -u root -p --all-databases | zip "$drt/db-$date.zip";
    zip -r "all_zipped-$date.zip" "$drt"/ -x "*/cache/*";
    rm -f "$drt/db-$date.zip" 
}

我注意到这里缺少连字符。

我的问题

为什么该函数失败/为什么 Bash 据称会忽略连字符?

答案1

您的环境中有该函数的旧版本,并且在编辑该文件以添加缺少的-.

当您重新获取该文件或重新启动 shell 时,您获得了在文件中看到的函数的正确版本。那个版本有效。

这就是它的全部内容;这里没有什么有趣的东西需要解释。这是一种相当常见的情况,环境最终与设置它的文件不同步,并且经常导致暂时的混乱,但它很容易解决,就像在这种情况下一样。

相关内容