2015-10-23 4 views
0

я могу писать и читать из файла:Перенаправление стандартный вывод и стандартный ввод в файл

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

ли Bash в состоянии сделать это неявно? Что-то вроде:

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

В то время как «неявный режим» включен, все стандартного вывода идет в b.txt и все STDIN читает из b.txt. Я пробовал:

exec > b.txt 

но это влияет только на стандартный вывод.

+0

'эхо | прочитайте c'?!? – Marged

+2

@Marged Это не сработает, потому что 'read' работает в подоболочке, поэтому его назначение переменной не сохраняется. – Barmar

ответ

-1

Отработка ответов здесь, я пришел с этим:

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

Я также понял, что это могло бы быть лучше оставить стандартный вывод и стандартный ввод в одиночку:

exec 3>b.txt 4<b.txt 
echo a >&3 
read c <&4 
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) 
    
+0

1 не имеет смысла; 'read' должен получать свой вход из того же файла, к которому поступает' echo'.2 не имеет смысла, 'c' не будет существовать, как только труба завершится –

+0

. Тогда замещение процесса, вероятно, то, что вы ищете, поэтому оно также находится в ответе. –

5

Вы можете использовать exec перенаправить как стандартный ввод и стандартный вывод одновременно

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

Вы также можете сохранить текущую 'tty' в переменной и использовать ее для возврата перенаправления:' mytty = $ (tty); ...; exec> "$ mytty" <"$ mytty" ' – whoan

+1

@ j.a. Это предполагает, что выход был первоначально направлен на tty. Что делать, если скрипт запускался с перенаправлением вывода? – Barmar

+0

Да @Barmar, он предполагает, что. – whoan