从var重定向到文件

时间:2011-11-04 17:04:05

标签: bash

#! /bin/bash
if [ $1 ]; then
  redirect="<"$1
else
  redirect="<&0"
fi
mysql --host=a.b --port=3306 --user=me --password='!' -D DCVBase2 $redirect

想要从文件或标准输入重定向。可以在$ redirect周围使用一些quatation吗?

4 个答案:

答案 0 :(得分:2)

这样的事情会起作用:

#!/bin/bash
if [ "$1" ]; then
    redirect="$1"
else
    redirect="/dev/tty"
fi
while read LINE
do
    echo ${LINE}
done < ${redirect}

答案 1 :(得分:1)

我担心我没有足够的声誉将此作为评论,所以这将是必须的。

Bash: redirect standard input dynamically in a script

答案 2 :(得分:1)

在标准bash中不可能,因为重定向在变量扩展之前被处理(虽然我似乎找不到参考,所以你必须相信我的实证结果)。

您可以使用eval命令解决这个问题:

$ redirect=">foo"
$ ls $redirect
ls: cannot access >foo: No such file or directory
$ eval ls $redirect

请注意这会打开一堆关于替换,引用等等的蠕虫,所以你必须小心逃避eval之前你不想解释的一切(你的命令中的!可能会成为一个问题,因为例子)。

$ foo=\$bar
$ bar=baz
$ echo $foo
$bar
$ eval echo $foo
baz

答案 3 :(得分:1)

您不能将“&lt; ...”放在变量中,但可以在变量中将参数放入

此外,从/ dev / fd / 0重定向stdin是一个无操作,因为/ dev / fd / 0是bash的stdin,这是mysql默认继承的。

所以你可以通过回退到/ dev / fd / 0中的stdin来完成这项工作,它看起来类似于James_R_Ferguson的答案,除了它使用/ dev / fd / 0,因为使用/ dev / tty假设bash的stdin是一个真正的终端。

#! /bin/bash

if [ -n "$1" ]; then # note, I changed this to test for non-empty
  redirect="$1"
else
  redirect="/dev/fd/0"
fi3
mysql --host=a.b --port=3306 --user=me --password='!' -D DCVBase2 < "$redirect"
相关问题