将stdout和stdin重定向到文件

时间:2015-10-23 22:48:07

标签: bash stdout stdin

我可以写一个文件并从中读取:

echo a > b.txt
read c < b.txt

Bash是否能够隐含地执行此操作?类似的东西:

<turn on implicit mode>
echo a
read c
<turn off implicit mode>

当“隐式模式”打开时,所有 stdout 都会转到 b.txt 并且所有 stdin 都会读取 来自 b.txt 。我试过了:

exec > b.txt

但它只影响 stdout

3 个答案:

答案 0 :(得分:5)

您可以使用exec同时重定向stdin和stdout

exec > b.txt < b.txt
echo a
read c

我不确定这是否会读到它所写的内容,但我测试了它并且它有效。

你可以通过复制其他FD中的原始FD来恢复它,然后在完成后恢复它们。

exec 10<&0 11>&1 > b.txt < b.txt
echo a
read c
exec <&10 10<&- >&11 11>&-
echo $c

答案 1 :(得分:0)

没有办法让bash承担这种行为,特别是考虑到b.txt是一个命令的输入和另一个命令的输出。针对类似问题有许多解决方案,根据您的实际问题可能适用:

  1. 假设您的意思是在脚本中而不是在交互模式下,您可以使用大括号重定向一组命令,这样您就不必拼出所有内容。如果您尝试在命令组中设置b.txt源和目标,它将无法工作。

    {
      echo a
      read c
    } <b_in.txt >b_out.txt
    
  2. 如果b.txt存在的事实并不重要,您可以使用管道或tee的管道:

    echo a | read c
    echo a | tee b.txt | read c
    
  3. 如果您需要b.txt,因为它的行为与文件相同,您也可以考虑进程替换。

    command_that_takes_a_file <(echo a)
    command_that_takes_stdin < <(echo a)
    

答案 2 :(得分:-1)

在这里解决这些问题,我想出了这个:

d=`tty`
exec >b.txt <b.txt
echo a
read c
exec >$d <$d

我也意识到单独留下stdout和stdin可能会更好:

exec 3>b.txt 4<b.txt
echo a >&3
read c <&4