Sto cercando un'interfaccia C per shell bash. Cioè Mi piacerebbe avere una serie di funzioni che mi permettano di aprire una sessione, eseguire comandi, restituire l'output (STDOUT, STDERR) e infine chiudere la shell. Potrebbe essere una libreria o un codice sorgente C basato su librerie standard.C-Interface per bash interattivo
risposta
Stai cercando di ottenere qualcosa di simile:
#include<stdio.h>
int main()
{
char a[1000];
gets(a);
system(a);
return 0;
}
uscita:
./a.out
cat testing.c
#include<stdio.h>
int main()
{
char a[1000];
gets(a);
system(a);
return 0;
}
gets()
e system
chiamata può ottenere all'interno di un ciclo.
Certo, ma questo non avrà un ambiente persistente. Molto probabilmente questo è ciò di cui l'OP è preoccupato. –
Sì. Ad esempio tutte le variabili di shell dovrebbero essere conservate tra i comandi successivi. – highsciguy
Il problema di root generale sembra essere come eseguire a livello di programmazione programma terminale interattivo.
Ora, questa sarebbe in parte mia richiedere test vero e proprio, ma si sarebbe all'incirca necessario
- creare tre pipes corrispondente al processo figlio
stdin
,stdout
, estderr
(la scrittura processo padre perstdin_pipe
e la letturastdout_pipe
estderr_pipe
) utilizzando la chiamata di sistemapipe(2)
; - fork e nel bambino close reindirizzare lo standard dentro, fuori e errore alle estremità corrette dei tubi precedenti chiamando
dup2(2)
; - exec (
execve(2)
/execv(3)
) la shell interattiva; - avvia i comandi writing a
stdin_pipe
e reading gli errori e le risposte degli altri due tubi.
(Se non è necessario fare la distinzione tra stdout
e stderr
si può solo semplificare la vita utilizzando popen(3)
- probabilmente si potrebbe reindirizzare stderr
a stdout
da una corretta scelta di stringa di comando).
Per una soluzione correttamente funzionante, tuttavia, credo che probabilmente sarebbe necessario utilizzare pseudo tty (pty(7)
) chiamando forkpty(3)
anziché solo fork.
Mentre inizia a diventare sempre più complicato prendere in considerazione tutti i tipi di pseudo terminali, perché non cercare la libreria C che dovrebbe essere in grado di fare tutto questo per te. O emulare come viene implementato expect o un altro equivalente di lingua come pexpect
. In realtà expect
sembra fornire una libreria C denominata libexpect(3)
per te in modo che non sia necessario scrivere tcl/tk per programmare l'interazione. Non conosco personalmente la biblioteca e potrebbero esserci altri migliori.
Avresti bisogno di usare ptys, quasi certamente. –
@JonathanLeffler - per scenari più complicati sì, certo. Ad esempio se i programmi da eseguire con shell richiedono informazioni sul terminale (come il numero di colonne per 'ls'). Penso che i comandi di shell semplici potrebbero forse ancora essere eseguiti con un banale approccio 'popen (3)' + 'pclose (3)' (impostazione delle variabili di ambiente, esecuzione di programmi a cui non interessano i terminali). In linea di principio, non riesco a capire perché shell come bash non dovrebbero consentire di usarli interattivamente senza tty (anche se sicuramente controllano se li stai usando usando tty e aggiustando di conseguenza il comportamento). – FooF
- 1. passare argomenti a un programma interattivo in modo non interattivo
- 2. Scp non interattivo
- 3. Debugger interattivo passo passo per Rust?
- 4. cacao wrapper per un comando interattivo Unix
- 5. Java Library per generare grafico interattivo
- 6. Come posso eseguire git rebase - interattivo in modo non interattivo?
- 7. uscita tubo dal comando interattivo a meno
- 8. Incorporamento F # interattivo
- 9. Script Python interattivo asincrono
- 10. 'svn add' interattivo
- 11. Come alimentare l'input a uno script bash interattivo da un file di testo
- 12. Linux C: output interattivo
- 13. Bash: programma di trucco in stdout di pensiero è un terminale interattivo
- 14. Utilizzo GIT non interattivo
- 15. Prompt interattivo con thor
- 16. Interprete ActionScript interattivo?
- 17. Disegno interattivo con kineticjs
- 18. Aggiunta di completamento a (interattivo)
- 19. Classificatore di albero decisionale interattivo
- 20. Input/output interattivo usando python
- 21. knitr vs. comportamento R interattivo
- 22. build docker interattivo da dockerfile?
- 23. Bash ordina per regexp
- 24. Possibile errore PInvoke F # interattivo
- 25. Emacs Elisp prompt interattivo dinamico
- 26. C'è un modo per determinare se Java System.in è "interattivo"?
- 27. Alternative di creazione di PDF interattivo per Acrobat?
- 28. Perché "goto-line" in Emacs solo per uso interattivo?
- 29. Consigli per il debug "dinamico/interattivo" delle funzioni in R?
- 30. Migliore libreria javascript per creare e diagramma di flusso interattivo
Non sono a conoscenza di alcuna interfaccia di questo tipo. Qual è il tuo caso d'uso? Qualunque cosa in cui l'insieme dei comandi non è noto in anticipo probabilmente si rivelerebbe un brutto scherzo. –
@highsciguy sembra essere alla ricerca di [expect] (http://expect.sourceforge.net/) come libreria C. – FooF
Perché? In ogni caso, il modo più semplice (per ottenere un ambiente persistente) sarebbe scrivere uno script di shell in un file e poi eseguirlo usando 'system'. OK, una pipe sarebbe più veloce, ma non è necessario averla veloce altrimenti non si userebbe mai una shell. – cdarke