如何在 bash 中通过管道传输到“空对象”?

问题描述 投票:0回答:1

我有以下内容:

if [[ "${outfile}" == '/dev/stdout' ]]; then
  "${mysql_cmd[@]}" <"${infile}" >"${outfile}"
else
  "${mysql_cmd[@]}" <"${infile}" |
    sed -e 's|[[:<:]]NULL[[:>:]]|\\N|g' >"${outfile}"
fi

sed
旨在将
NULL
转换为
\N
,以便输出可以与
LOAD DATA LOCAL INFILE
一起使用。

我想把它做成类似于这样的一句台词:

"${mysql_cmd[@]}" <"${infile}" | "${transformer_cmd[@]}" >"${outfile}"

transformer_cmd
是“空对象”(即不是
sed
命令)时,
mysql
必须继续交互(这样会打开一个
mysql
shell,可以在其中输入 SQL 语句)。我已经尝试将
cat
作为
transformer_cmd
,但未满足此要求。

这可能吗?如果是的话,怎么办?

我宁愿避免做像

"${mysql_cmd[@]}" <"${infile}" "${transformer_cmd}" >"${outfile}"
这样的事情,这样
transformer_cmd
包括
|
,但如果没有其他方法,我会这样做。

附录:

transformer_cmd
包括
|
不起作用,因为由于某种原因
${transformer_cmd}
(不带双引号)仍然被解释为
mysql
的参数。

mysql bash
1个回答
0
投票

我无法找到合适的

transformer_cmd
,但是根据@chepner给出的提示,我能够想出以下内容:

mysql_cmd "${mysql_options[@]}"

其中

mysql_cmd
默认为:

function mysql_cmd() {
  mysql "$@"
}

如果为脚本提供了一个选项,则将被覆盖为:

function mysql_cmd() {
  mysql "$@" |
    sed -e 's|\\\\|\\|g' |
    tee "${outfile}"
}
© www.soinside.com 2019 - 2024. All rights reserved.