Poszukuję interfejsu C dla powłok bash. To znaczy. Chciałbym mieć zestaw funkcji, które pozwolą mi otworzyć sesję, wykonać polecenia, zwrócić wyjście (STDOUT, STDERR) i wreszcie zamknąć powłokę. Może to być biblioteka lub kod źródłowy C oparty na standardowych bibliotekach.Interfejs C dla bashu interaktywnego
Odpowiedz
Czy chcesz osiągnąć coś takiego:
#include<stdio.h>
int main()
{
char a[1000];
gets(a);
system(a);
return 0;
}
wyjściowy:
./a.out
cat testing.c
#include<stdio.h>
int main()
{
char a[1000];
gets(a);
system(a);
return 0;
}
gets()
i system
połączenie może dostać się do środka pętli.
Oczywiście, ale to nie będzie miało trwałego środowiska. Najprawdopodobniej to dotyczy OP. –
Tak. Na przykład wszystkie zmienne powłoki powinny zostać zachowane między kolejnymi poleceniami. – highsciguy
Ogólny problem główny to programowo uruchamiany interaktywny program terminalowy.
Teraz byłoby to w mojej części wymaga rzeczywistego badania, ale można z grubsza trzeba
- utworzyć trzy pipes odpowiadający procesu potomnego
stdin
,stdout
istderr
(w piśmie procesowym z rodziców dostdin_pipe
i czytaniestdout_pipe
istderr_pipe
) przy użyciu wywołania systemowegopipe(2)
; - i dla dziecka close przekieruj standardowe wejście, wyjście i błąd na właściwe końce powyższych rur, wywołując
dup2(2)
; - exec (
execve(2)
/execv(3)
) Twoja interaktywna powłoka; - Uruchomienie writing poleceń do
stdin_pipe
i reading błędów i odpowiedzi z dwóch pozostałych potoków.
(Jeśli nie trzeba dokonać rozróżnienia pomiędzy stdout
i stderr
można po prostu uprościć swoje życie za pomocą popen(3)
- prawdopodobnie można przekierować stderr
do stdout
przez odpowiedni dobór ciąg poleceń).
Dla prawidłowo działającego rozwiązania uważam jednak, że prawdopodobnie będziesz musiał użyć pseudo ttys (pty(7)
), dzwoniąc pod numer forkpty(3)
zamiast po prostu fork.
Zaczynając coraz bardziej skomplikować się, aby wziąć pod uwagę wszystkie przypadki radzenia sobie z pseudo terminalami, dlaczego nie szukać C oczekiwać biblioteki, która powinna być w stanie zrobić to wszystko dla ciebie. Lub emulować, w jaki sposób zaimplementowany jest expect lub inny równoważny język, taki jak pexpect
. Aktualnie wydaje się, że expect
udostępnia bibliotekę C nazwaną libexpect(3)
, aby nie trzeba było pisać tcl/tk w celu programowania interakcji. Nie jestem osobiście zaznajomiony z biblioteką i mogą istnieć inne lepsze.
Musisz użyć ptys, prawie na pewno. –
@ JonathanLeffler - dla bardziej skomplikowanych scenariuszy tak, na pewno. Na przykład, jeśli programy uruchamiane z powłoką wymagają informacji o terminalu (np. Liczba kolumn dla 'ls'). Myślę, że proste polecenia powłoki mogą nadal działać z trywialnym podejściem opartym na 'popen (3)' + 'pclose (3)' (ustawianie zmiennych środowiskowych, uruchamianie programów, które nie dbają o terminale). Zasadniczo nie rozumiem, dlaczego powłoki takie jak bash nie pozwalają na interaktywne używanie ich bez tty (chociaż na pewno sprawdzają, czy używasz tty i odpowiednio dostosowujesz zachowanie). – FooF
- 1. C#: Ogólny interfejs dla liczb
- 2. Hasło "have" dla zakończenia bashu
- 3. Symulacja sesji interaktywnego pytona
- 4. Interfejs API wyszukiwarki Google dla języka C#
- 5. C stubbing. Interfejs dla każdego testowalnego obiektu?
- 6. Interfejs Qt dla istniejącego projektu C++
- 7. Test jednostkowy dla skryptu ukończenia bashu
- 8. Uciekające znaki w bashu (dla JSON)
- 9. Narzędzia interaktywnego diagramu architektonicznego
- 10. Interfejs Dziedziczenie w C++
- 11. C realizacja nieruchomość # interfejs
- 12. Interfejs C# - R
- 13. C# rodzajowych Interfejs kowariancji
- 14. Interfejs administracyjny dla SQLAlchemy?
- 15. Interfejs nazewnictwa dla przymiotników
- 16. Interfejs ograniczenie dla IComparable
- 17. Interfejs wiersza poleceń w C++
- 18. Czy istnieje sposób zmiany czcionek i kolorów dla interaktywnego okna C# w Roslyn CTP?
- 19. Interfejs API Bluetooth 4.0 (niskoenergetyczny) dla pulpitu Windows C# application
- 20. Domyślny interfejs ustaw w C#
- 21. Czy Qt ma interfejs C?
- 22. Warunek jednej linii w bashu
- 23. Unikalne linie w bashu
- 24. Wyrzucanie śmieci w bashu
- 25. przywrócić usunięte polecenie w bashu
- 26. interfejs Projektowanie dla hierarchicznej jednostki
- 27. Interfejs GUI dla skryptu R
- 28. Interfejs jQuery-like dla PHP?
- 29. SVN. Spróbuj ponownie interaktywnego rozwiązywania konfliktów
- 30. Tymczasowe przekierowanie wejścia w bashu
Nie znam takiego interfejsu. Jaki jest twój przypadek użycia? Wszystko, co nie jest znane z góry, prawdopodobnie okazałoby się brzydkim kruchym hackerem. –
@highsciguy wydaje się szukać niektórych [spodziewać] (http://expect.sourceforge.net/) jak biblioteka C. – FooF
Dlaczego? W każdym razie, najprostszym sposobem (aby uzyskać trwałe środowisko) byłoby napisanie skryptu powłoki do pliku, a następnie wykonanie go za pomocą 'system'. OK, rura byłaby szybsza, ale nie można potrzebować szybko, w przeciwnym razie nie używałbyś w ogóle powłoki. – cdarke