bash: промывка стандартного ввода (стандартный ввод) - PullRequest
3 голосов
/ 18 июня 2010

У меня есть скрипт bash, который я в основном использую в интерактивном режиме.Однако иногда я передаю какой-то вклад в сценарий.После обработки stdin в цикле я копирую файл, используя «-i» (интерактивно).Однако, это никогда не выполняется (в режиме конвейера), так как (я думаю) стандартный ввод не был сброшен.Чтобы упростить пример:

#!/bin/bash
while read line
do
    echo $line
done
# the next line does not execute 
cp -i afile bfile

Поместите это в t.sh и выполните с: ls |./t.sh

Чтение не выполняется.Мне нужно очистить стандартный ввод перед чтением.Как это могло сделать это?

Ответы [ 2 ]

6 голосов
/ 18 июня 2010

Это не имеет ничего общего с промывкой. Ваш стандартный вывод - это вывод ls, вы прочитали все это с помощью цикла while, поэтому read немедленно получает EOF. Если вы хотите прочитать что-то из терминала, вы можете попробовать это:

#!/bin/bash
while read line
do
    echo $line
done
# the next line does execute 
read -p "y/n" x < /dev/tty
echo "got $x"
0 голосов
/ 18 июня 2010

Я не уверен, что здесь можно делать то, что вы хотите (то есть, если read принимает данные от пользователя, а не от ls). Проблема в том, что все стандартные входные данные для вашего скрипта взяты из канала, точка. Это тот же файловый дескриптор, поэтому он не будет «переключаться» на терминал только потому, что вы этого хотите.

Один из вариантов - запустить ls как дочерний элемент сценария, например:

#!/bin/bash

ls | while read line
do
    echo $line
done

read -p "y/n" x
echo "got $x"
...