我可以写一个文件并从中读取:
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 。
答案 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
是一个命令的输入和另一个命令的输出。针对类似问题有许多解决方案,根据您的实际问题可能适用:
假设您的意思是在脚本中而不是在交互模式下,您可以使用大括号重定向一组命令,这样您就不必拼出所有内容。如果您尝试在命令组中设置b.txt
源和目标,它将无法工作。
{
echo a
read c
} <b_in.txt >b_out.txt
如果b.txt
存在的事实并不重要,您可以使用管道或tee
的管道:
echo a | read c
echo a | tee b.txt | read c
如果您需要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