2014-01-23 4 views
0

У меня есть сложный скрипт bash, который очень часто использует «read -p» (вывод stderr). И теперь мне нужно дублировать весь ввод сценария с терминала в файл журнала.Как дублировать stdin в файл

tee file.log | script.sh 

Эта команда не работает, потому что игнорирует вывод для пользователя. Пример:

#!/bin/sh 
echo "start" 
read -p "input value: " val 
echo $val 
echo "finish" 

Терминал запуска:

start 
input value: 3 
3 
finish 

Tee пробег:

# tee file.log | ./script.sh 
start 
3 
3 
finish 
+0

вы ищете 'script' ? 'script file.log; ./script.sh; exit' – ray

+0

В вашем вопросе говорится, что вы хотите сохранить ввод пользователя. 'stderr' выводится, а не вводится. – Barmar

+0

нет, мне нужно регистрировать вход пользователя, поэтому файл результатов моего примера должен содержать только 3. –

ответ

1

Не знаю, почему вы используете tee здесь. То, что я подозреваю, что происходит, ему потребуется ввод, поэтому жду его, а затем труб 3 на стандартный вывод

-p prompt 
Display prompt, without a trailing newline, before attempting 
to read any input. The prompt is displayed only if input is coming from a 
terminal. 

Однако вход не отправляются с TTY здесь так проворным никогда не печатаются. Мне все еще кажется очень странным использовать tee, но вы можете просто использовать echo -n вместо -p flag for read и он должен работать.

#!/bin/sh 
echo "start" 
echo -n "input value: " 
read val 
echo $val 
echo "finish" 

e.g.

> tee file.log | ./abovescript 
start 
input value: 3 
3 
finish 

> cat file.log 
3 

Также не уверен, как получить тройник, чтобы корректно завершить из-скрипта в здесь, так что вам нужно нажать клавишу возврата в конце, который, конечно, вызывает символ новой строки.

Тем не менее, так как это дополнительная линия в любом случае каждый раз, кажется, хуже, чем просто делать echo "$val" >> file.log каждый раз, хотя лучшим вариантом было бы просто использовать функцию

#!/bin/bash 
r() { 
    read -p "input value: " val 
    echo "$val" >> file.log 
    echo "$val" 
} 

echo "start" 
val=$(r) 
echo "$val" 
echo "finish" 
+0

вы правы, но, возможно, есть еще один способ через exec 5> & 0 в начале скрипта –

+0

@ andr3y Как бы вы использовали fd 5? Edit: ok Я думаю, вы имеете в виду, что чтение из fd 5 в переменную ... может работать, чтобы распечатать приглашение, но у вас все еще есть проблема 'tee', не заканчивающаяся – BroSlow

+0

Пример для дублирования stdout: exec 5> & 1 npipe = test.pipe trap "rm -f $ npipe" EXIT mknod $ npipe p tee <$ npipe temp.tmp & exec 1> & - exec 1> $ npipe –

 Смежные вопросы

  • Нет связанных вопросов^_^