2013-03-25 12 views
8

Posiadam plik wykonywalny "tylko do odczytu" ("tylko do odczytu"), który zawsze wykonuję, po którym następuje wejście "input1" (ciąg znaków), a następnie włączam moją firmę "" i „exit”, kiedy to ochotę:Rurka do pliku wykonywalnego bez zamykania/EOF w bashu

$ myexec 
> input1 
> do something else for as long as I like 
> exit 

Co chciałbym zrobić, to automatycznie execute „myexec” z wejścia „INPUT1”, a następnie być w stanie „zrobić coś innego, tak długo, jak lubię". Z tego co widzę, moje opcje:

$ myexec <<< "input1" 

lub

$ echo "input1" | myexec 

lub

$ myexec << EOF 
input1 
EOF 

Ale problem z tych metod jest to, że kończą się one "myexec" po przeczytaniu „input1 ". Jak mogę uniknąć EOF/exit/terminate?

Odpowiedz

5

Możesz użyć , aby zautomatyzować to. Na przykład:

#!/usr/bin/expect 

spawn /my/exec 
expect "> " 
send "input1\r" 
interact 
+0

Bardzo dziękuję! – kd88

0

Można utworzyć pipe i słuchać wejść z tail -f

mkfifo pipe 
tail -f pipe | ./script.sh 

przykładu treści script.sh

#!/bin/bash 

while read row 
do 
    if [ "${row}" = "exit" ]; then 
     break 
    fi 
    echo "ROW READ $row" 
done 

echo "script exit" 
exit 0 

Następnie z innym scenariuszem, nakarmić rurę

echo "example content" > ./pipe 
echo "bla bla bla" > ./pipe 
echo "exit" > ./pipe 
echo "" > ./pipe 

będziesz uzyskać

[[email protected] ~]# tail -f pipe | ./script 
ROW READ example content 
ROW READ bla bla bla 
script exit 
[[email protected] ~]# 
0

To brzmi prawie jak chcesz FIFO, który jest nazwany potok przechowywane w systemie plików. Każde wyjście, które przekierujesz, przejdzie z drugiej strony do tego, co słuchasz. Spróbuj tego:

mkfifo myexec.fifo 
myexec < myexec.fifo & 
echo input1 > myexec.fifo 
echo input2 > myexec.fifo 

Można to sprawdzić za pomocą bash i mający go uruchomić polecenia, które są wysyłane do FIFO, w poniższym przykładzie:

mkfifo bash.fifo 
/bin/bash < bash.fifo & 
echo uname > bash.fifo 
Darwin 

Znak & odrywa proces w tle, Tak długo, jak myexec będzie kontynuował słuchanie, będzie kontynuował wykonywanie poleceń.

Jeśli myexec wystaje, można owinąć je w pętli while:

while [ 1 ]; do myexec < myexec.fifo; done 

Po myexec pobiera zawartość tego, co czeka w FIFO, to iteracji pętli. Jeśli fifo jest puste, będzie czekać.

+0

Problem polega na tym, że chciałbym współdziałać z obiektami utworzonymi w "myexec" (procesach X-forwarded), które znikają, gdy tylko zostaną utworzone tą metodą ... Ja chciałbym tej metody, ale bez odłączania jej! – kd88

5

Można użyć cat na to:

$ { echo "input1"; cat; } | my exec 
Powiązane problemy