在输入中使用 cat 有用或无用

在输入中使用 cat 有用或无用

在我的 mysql 恢复脚本中,我使用先前创建的 mysqldump 文件作为输入。此文件名在命令行上作为参数提供,可能会也可能不会被 gzip 压缩。我想将该文件用作 mysql 语句的输入,但不更改/压缩该文件,而只是读取其内容。

我使用以下代码作为 mysql 命令的输入(我喜欢):

mysql -u $user -p"$pass" $dbname <( [[ "${mysqldumpfile: -3}" = ".gz" ]] && gzip -d -c "${mysqldumpfile}" || cat "${mysqldumpfile}" )

因此 mysql 转储文件名以“.gz”结尾,然后我将 gunzip 发送到 stdout,否则我将 cat 发送到 stdout。两者的 stdout 都用作 mysql 命令的 stdin。

这是 UUOC 吗?有没有办法不使用 cat?

还有其他方法可以做到这一点(在一行上)吗?要清楚的是,我不想签入 if/then/else/ 语句并执行两个不同的 mysql 命令。我喜欢一个可以使用两个不同输入的命令行。

编辑:由于zcat -f如果数据未压缩,则会同时解压缩和 cat,或者仅 cat,因此这不是最好的示例。我仍然想知道是否有其他方法可以<( test && do_this_command_as_input || cat this_is_the_input )不使用 cat。

在有人提到它之前...您无法使用 输入到 mysql 命令行<( )

答案1

这不是你要找的猫:)

mysql -u $user -p"$pass" $dbname <(zcat -f  $mysqldumpfile)

编辑:忘记了括号

编辑2:

好的,这次完全没有 cat 或 zcat:

gunzip -f $mysqldumpfile 2>/dev/null; mysql -u $user -p"$pass" $dbname < ${mysqldumpfile%%.gz}

但更喜欢第一个选项

好的,第三个版本我完成了 :P

mysql -u $user -p"$pass" $dbname < (gzip -fdc $mysqldumpfile)

答案2

这并不是无用的利用cat

您需要 ,cat因为它是 的替代中性过滤器gzip。要么处理文件gzip然后转储到 stdout,要么不进行处理并转储到 stdout。

假设你只获得 gzip 压缩文件,那么命令将如下所示:

mysql -u $user -p"$pass" $dbname <( gzip -d -c "${mysqldumpfile}" )

现在要求发生了变化,您只能获得纯文件:

mysql -u $user -p"$pass" $dbname <( cat "${mysqldumpfile}" )

这将是无用的,cat因为可以简化为:

mysql -u $user -p"$pass" $dbname "${mysqldumpfile}"

在您的命令中,您不能跳过,cat因为您不能跳过过程替换。


这是您的命令,虽然很详细,if then else但只有一行mysql

togzip_ornottogzip() {
  if [[ "${mysqldumpfile: -3}" = ".gz" ]]; then
    gzip -d -c "${mysqldumpfile}"
  else
    cat "${mysqldumpfile}"
  fi
}

mysql -u $user -p"$pass" $dbname <( togzip_ornottogzip )

现在我对如何更好地编写命令的建议是:

我建议您重写脚本,以便始终将纯文本文件作为 stdin 的输入:

mysql -u $user -p"$pass" $dbname <( cat )

我们来调用这个脚本domysql_stdin

然后编写两个脚本,均以文件名作为参数。一个脚本需要 gzip 文件,另一个脚本需要纯文本文件。然后,两个脚本都会将输出重定向到第一个脚本。

需要 gzip 压缩文件:

gzip -d -c "${mysqldumpfile}" | domysql_stdin

期望纯文本文件:

domysql_stdin < "${mysqldumpfile}"

让我们打电话给domysql_gzipped他们domysql_plain

然后编写第四个脚本,该脚本以文件名作为参数,检查文件是否经过 gzip 压缩,然后调用经过 gzip 压缩的预期脚本或普通预期脚本。

if [[ "${mysqldumpfile: -3}" = ".gz" ]]; then
  how="gzipped"
else
  how="plain"
fi

domysql_$how "${mysqldumpfile}"

这样,每个脚本都可以做一件简单的事情并且每个部分都可以单独使用。

您也可以将所有内容放在一个包含四个函数的文件中,而不是四个文件。您只需要注意名称冲突和变量可见性和生命周期。

相关内容