2016-05-24 6 views
0

Привет Я пытаюсь создать программу в bash. Идея в том, что я бы открыл два терминала. Можно было бы ввести вход с трубой cat > pipe. Другой терминал будет запускать скрипт bash с целым верным циклом и считывать входные данные из канала. Вход будет сохранен в переменной, и последующее действие будет происходить в зависимости от того, что хранится внутри. Это то, что я пробовал.Вход через трубу в отдельный терминал

Программа получает имя трубы в качестве аргумента и хранится в переменной трубе.

while true; do 
     input=$(cat<$pipe) 
     if [ "$input" == "exit" ]; then 
      exit 0 
     fi 
done 

Я попытался ввести строку выхода через трубу, но программа не останавливается так, как должна. Если переменная не получает никакого значения из трубы, как я могу ее исправить? Или что-то еще не так, что предотвращает выход?

+0

спасибо совершенно забыл, когда я сочинительство мысль, я спросил в начале – Tenebris

+0

попробуйте запустить его с '#/USR/бен/Баш -vx' (или! независимо от того, что ваша оболочка добавляет -x) как самую верхнюю строку для отладки. Может быть, добавьте вывод здесь, если он не поможет вам найти решение. –

+0

В 'cat <$ pipe' второго терминала, что означает значение' $ pipe'? – sjsam

ответ

0

Ваш второй скрипт должен быть что-то вроде:

#!/bin/bash 
pipe="$1" # Here $1 is full path to the file pipe as you have confirmed 
while true 
    do 
input=$(cat<"$pipe") 
if [[ $input =~ exit ]] #original line was if [ "$input" == "exit" ] 
    then 
exit 0 
fi 
done 

Помните $(cat<"$pipe") будет хранить весь файл в виде строки. Итак, хотя у вас есть слово exit где-то в файле pipe, исходное условие if [ "$input" == "exit" ] будет ложным, за исключением случая, когда первое слово, которое вы вводите для cat>pipe, само является «выходом».

Небольшое решение tweakish это сделать матч регулярного выражения (=~), как я сделал, но это решение не является очень надежным, потому что если вы вводите что-то вроде «я не хочу выйти», для cat>pipe второй сценарий выхода.

Второе решение будет:

#!/bin/bash 
pipe="$1" 
while true; do 
input=$(tail -n1 "$pipe") #checking only the last line 
if [[ "$input" == "exit" ]] #original if condition 
    then 
exit 0 
fi 
done 
Смежные вопросы