首页 > 解决方案 > 为什么脚本中的两个连续制表符和 EOF 会导致当前目录中的列表文件?

问题描述

bash 脚本中的正常和正式的此处文档如下。

clear-mysql(){
    mysqlword="xxxxx"
    port="22"
    ip="11.22.33.44"
    tmpdb="xxxx"
    ssh -p $port   root@{$ip}  "mysql -u root -p$mysqlword <<EOF
        use ${tmpdb};
        UPDATE xx SET yy = replace(post_content, 'domain', '"http://$ip/wp"');
EOF"
}

<<-您可以在这种 bash 中使用另一种正确的格式(制表符和)。

clear-mysql(){
    mysqlword="xxxxx"
    port="22"
    ip="11.22.33.44"
    tmpdb="xxxx"
    ssh -p $port   root@{$ip}  "mysql -u root -p$mysqlword <<-EOF
        use ${tmpdb};
        UPDATE xx SET yy = replace(post_content, 'domain', '"http://$ip/wp"');
        EOF"
}

<<-现在我为这个简单的 bash 片段编写了错误的格式(两个选项卡和),如下所示。

clear-mysql(){
    mysqlword="xxxxx"
    port="22"
    ip="11.22.33.44"
    tmpdb="xxxx"
    ssh -p $port   root@{$ip}  "mysql -u root -p$mysqlword <<-EOF
        use ${tmpdb};
        UPDATE xx SET yy = replace(post_content, 'domain', '"http://$ip/wp"');
                EOF"
}

将其复制并粘贴到终端中。

在此处输入图像描述

我知道这是错误的格式,并且我知道 bash 中的正确字符串格式。
让我感到困惑的是,为什么两个选项卡和<<-EOFEOF导致列出当前目录中的所有文件?
是的,两个选项卡触发了自动完成,

[root@localhost tmp]# 
Display all 1137 possibilities? (y or n)

Tab 和 tab 将显示所有 1137 ,而不是列出当前目录中的文件。

在此处输入图像描述

标签: bashlsheredoc

解决方案


推荐阅读