Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Frenky 30. 11. 2017, 14:38:51
-
Zdravím, mám nějaký script napsaný v C, můžu do toho souboru přidat vlastní funkci která je pro bash a následně ji spustit? Chtěl bych zachovat pouze jeden soubor. Díky
-
Zdravím, mám nějaký script napsaný v C, můžu do toho souboru přidat vlastní funkci která je pro bash a následně ji spustit? Chtěl bych zachovat pouze jeden soubor. Díky
To je pro mě docela novinka, že v C se skriptuje :)... Doporučuji nastudovat si co to je jazyk C a až potom jak se z něj spouštějí programy/systémové příkazy (system(), exec*(), fork()...)
-
Jo, stačí skript překompilovat v python++ do binární podoby a to pak vložit na konec souboru s tím C skriptem a potom překódovat do hexadimálního tvaru a pak spustit přes cmd.exe powershell -BypassExec a mělo by to fungovat.
-
Mezi tím co budu já studovat jazyk C, ty si přečti ještě jednou dotaz..
-
Jo, stačí skript překompilovat v python++ do binární podoby a to pak vložit na konec souboru s tím C skriptem a potom překódovat do hexadimálního tvaru a pak spustit přes cmd.exe powershell -BypassExec a mělo by to fungovat.
Poběží to pouze pod Linuxem.
-
Toto musi byt trolling ...
-
nie nie, to je len dalsi idiot, co sa ide hrat na it-ckara...
-
Tak to je už vrchol bashismu :-)))
-
Proč musí být každý kdo se něco učí idiot? Nechápu.
-
Proč musí být každý kdo se něco učí idiot? Nechápu.
To je přece unixová filosofie, umět jednu jednoduchou věc, ale dobře.
-
Proč musí být každý kdo se něco učí idiot? Nechápu.
to som kde napisal?
kazdy ne-idiot si najprv nastuduje teoriu, aby vedel o com sa toci a potom by riesil problemy...
-
Nechápu, co za lopaty sem píše. Taková věc jde samozřejmě bez problému udělat a kdybyste byli špičkoví konzultanti, tak na to máte taky:. Stačí si povšimnout, že Bash má komentáře #, zatímco v C se # dá použít pro #define. A naopak // a /* */ projdou v Bashi, pokud okolo dáme #.
/tmp> cat polyglot.c
#include <nsautil.h>
#define FOO BAR
int abc = 5;
static float pi = 3.14;
main() {
printf /* # */ ("hello world, %i, %f\n", abc, pi);
}
funkce_pro_bash() {
#define nic nic1 /*
echo Toto je funkce pro bash.
# normálně tu můžeme používat komentáře
# třeba uděláme cyklus
grep ^processor /proc/cpuinfo | while read line; do
echo $line | tr a-z A-Z
done # */
return 0;
}
/tmp> . polyglot.c
int: bablbam
static: bablbam
/tmp> funkce_pro_bash
Toto je funkce pro bash.
PROCESSOR : 0
PROCESSOR : 1
/tmp> jcc polyglot.c
polyglot.c:9:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main() {
^~~~
polyglot.c:13:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
funkce_pro_bash() {
^~~~~~~~~~~~~~~
/tmp> ./polyglot
hello world, 5, 3.140000
-
@jenda
nejde o to, že se to nedá udělat, ale že je to nekoncepční zvěrstvo
-
Programováním se živím už mnoho let, a to převážně v C, občas shell, a linux mám i doma na svém vlastním desktopu. Dotaz jsem četl celkem 3x a stejně jsem nepochopil co tazatel chtěl.
1. Věřím, že první problém je ve formulaci dotazu.
2. Byl ten dotaz míněn tak, zda je možné vytvořit jeden soubor který bude reprezentovat jak validní shell-skript tak validní C-zdroják a to zároveň ?
-
Zdravím, mám nějaký script napsaný v C, můžu do toho souboru přidat vlastní funkci která je pro bash a následně ji spustit? Chtěl bych zachovat pouze jeden soubor. Díky
Dobrý den,
Co myslíte tím script v C? C je přeci kompilovaný jazyk. Špatně jste naformuloval dotaz.
Jestli si domýšlím dobře, máte C program. Po zkompilování a spuštění binárky chcete, aby tento program zavolat shell/bash a předal mu nějaký script. Z vašeho dotazu vůbec nelze odvodit jestli chcete aby původní binárka čekala na dokončení scriptu, jestli má i zachytávat výstupy, nebo jestli se script má jen spustit a binárka bez ohledu na něj pokračovat dál.
V každém případě asi nejlépe Vám odpověděl ByCzech v 16:05:34, nastudujte si odkazované části C.
Nicméně mít v binárce zabalený script mi přijde zhůvěřilost. Script je interpretovaný jazyk jehož výhoda je to, že je čitelný a není nutné ho kompilovat. Je tím pádem snadno editovatelný a upravitelný i na jiný systém/distribuci nebo nástroje. Když ho zabalíte do binárky tak ztratíte výhodu editovatelnosti (musíte to prohnat kompilací), tím zhoršíte jeho čitelnost a srozumitelnost. Současně ten script ale úplně neskryjete (pokud to bylo vaším cílem), protože i v té binárce bude rozpoznatelný na první pohled a při trošce snahy i rozluštitelný. O problematice různých režimů iniciace shellu podle toho jak se volá a tím pádem rizika různých průběhů zpracování scriptu nemluvě...
A jestli jediným důvodem je "chci to mít v jednom souboru protože se mi to zdá lepší mít to pohromadě", tak vězte že to tak není. Za pár týdnů až měsíců až se k tomu budete potřebovat vrátit tak se sám proklejete. Tady pomůže jedině kvalitní dokumentace a komentáře vlastního kódu. Alespoň jako první záchytný bod si pro každý projekt poctivě psát Readme.txt a neházet zaběhnuté konvence za hlavu.
-
Mám soubor test.c
v tomto souboru chci mít program napsaný v Cečku (jedna funkce main) a taky 3 bash funkce.
main() {
spusti bash_funkce_1;
}
function bash_funkce_1()
{
..
bash_funkce_2
..
}
function bash_funkce_2()
{
..
bash_funkce_3
..
}
function bash_funkce_3()
{
..
exit $?
}
Všechno to bude v tom jednom souboru test.c, zkompiluji to, spustím to, funkce main spusti bash funkci 1, ta spustí bash funkci 2, ta spustí bash funkci 3. Funkce main čeká na ukončení bash fukce, a to je všechno co potřebuji.
-
Ne, nechceš. Možná tam chceš mít ten skript jako char[] a spouštět ho přes system(3) (osobně bych ale stejně důrazně doporučil mít to v samostatném souboru), ale určitě tam nechceš mít ty funkce takto vypsané.
-
Frekny, je ti jasné, že se snažíš zmixovat na velice odlišné jazyky? Mluvíš o funkcích bashe, ale mám spíše dojem, že takhle chceš volat i další aplikace (např. ls je aplikace, zatímco exit je bash funkce, ono se to nedá moc dobře odlišit).
Z C můžeš volat jiný program, ale rozhodně nebude mít přístup do proměnných nadefinovaných v C a už rozhodně nebude fungovat jak tvůj zmíněný exit.
Každopádně bash je napsaný v C, jako převážná většina těch standardních aplikací na linuxu, nic ti nebrání (kromě GPL licence) vzít jejich zdrojové kódy a vnořit je do své aplikace a pak opravdu můžeš používat bash funkce nativně, jen to řeší pouze tvůj dotaz a nejspíš nikoliv tvůj problém.
-
Ze Stackowerflow https://stackoverflow.com/questions/3736210/how-to-execute-a-shell-script-from-c-in-linux
použijete funkci system, nebo popen
#include <stdio.h>
#include <stdlib.h>
#define SHELLSCRIPT "\
#/bin/bash \n\
echo \"hello\" \n\
echo \"how are you\" \n\
echo \"today\" \n\
"
/*Also you can write using char array without using MACRO*/
/*You can do split it with many strings finally concatenate
and send to the system(concatenated_string); */
int main()
{
puts("Will execute sh with the following script :");
puts(SHELLSCRIPT);
puts("Starting now:");
system(SHELLSCRIPT); //it will run the script inside the c code.
return 0;
}
-
Frekny, je ti jasné, že se snažíš zmixovat na velice odlišné jazyky? Mluvíš o funkcích bashe, ale mám spíše dojem, že takhle chceš volat i další aplikace (např. ls je aplikace, zatímco exit je bash funkce, ono se to nedá moc dobře odlišit).
Z C můžeš volat jiný program, ale rozhodně nebude mít přístup do proměnných nadefinovaných v C a už rozhodně nebude fungovat jak tvůj zmíněný exit.
Každopádně bash je napsaný v C, jako převážná většina těch standardních aplikací na linuxu, nic ti nebrání (kromě GPL licence) vzít jejich zdrojové kódy a vnořit je do své aplikace a pak opravdu můžeš používat bash funkce nativně, jen to řeší pouze tvůj dotaz a nejspíš nikoliv tvůj problém.
No zase na druhé straně, podobně funguje každé ORM, v jednom jazyce prostředky toho jazyka vytvoří SQL příkaz, zde místo SQL se použije jako výsledek bash.
-
Vložte script do programu jako konstantu a spusťte ho funkcí system. Před vložením do c programu to projeďte tímhle http://tomeko.net/online_tools/cpp_text_escape.php?lang=en
-
No zase na druhé straně, podobně funguje každé ORM, v jednom jazyce prostředky toho jazyka vytvoří SQL příkaz, zde místo SQL se použije jako výsledek bash.
Všechen SW je založena na komunikaci s jinou aplikací, ono to je běžné :), ale jak vidíš v té ukázce co frenky poslal, má tam třeba exit $?, což je nesmyslu, v C mají funkce návratový kód, v bashi zase exit code a spojit to dohromady není jen volání.
-
OK, ještě bych položil jeden dotaz a tím bych to uzavřel.
Umí C všechno co bash? Myslím tím funkce a příkazy které jdou v bash spustit?
Když se rozhodnu pro napsání to v C a chtěl bych po někom aby mi napsal nějaké příklady jako je vytvoření adresáře a souboru, seřazení pole, načítání textu ze souboru, spuštění nějaké akce po stisknutí klávesy atd.. Kolik můžu čekat cenu, stokoruny? tisícikoruny?
Díky všem moc za informace.
-
OK, ještě bych položil jeden dotaz a tím bych to uzavřel.
Umí C všechno co bash? Myslím tím funkce a příkazy které jdou v bash spustit?
Když se rozhodnu pro napsání to v C a chtěl bych po někom aby mi napsal nějaké příklady jako je vytvoření adresáře a souboru, seřazení pole, načítání textu ze souboru, spuštění nějaké akce po stisknutí klávesy atd.. Kolik můžu čekat cenu, stokoruny? tisícikoruny?
Díky všem moc za informace.
Proc to musi byt zrovna C? Moc nechapu pozadovany vysledek, ale pokud to bude prace se soubory a procesy, jdi do BASHe, pokud s datovymi strukturami mimo pole/slovnik, do jineho jazyka. Ale cecko mi tam nezapada, to ma samozrejme svoje oblasti pouziti a delaji v nem asi miliony developeru, ale fakt je to pro tvoji aplikaci?
-
OK, ještě bych položil jeden dotaz a tím bych to uzavřel.
Umí C všechno co bash? Myslím tím funkce a příkazy které jdou v bash spustit?
Když se rozhodnu pro napsání to v C a chtěl bych po někom aby mi napsal nějaké příklady jako je vytvoření adresáře a souboru, seřazení pole, načítání textu ze souboru, spuštění nějaké akce po stisknutí klávesy atd.. Kolik můžu čekat cenu, stokoruny? tisícikoruny?
Díky všem moc za informace.
Rekni co presne chces. Urcite ti tady na foru nekdo poradi zadarmo.
-
OK, ještě bych položil jeden dotaz a tím bych to uzavřel.
Umí C všechno co bash?...
Jak uz ti bylo receno, bash je v C napsanej, takze zcela jiste umi C vse co umi bash a mnohem vic, jen si to musis naprogramovat, nebo nekde vzit hotovy.
A jelikoz je to nejspis dalsi z mnoha skolnich uloh, tak jen tak pro info, volat externi aplikaci z kodu jiny aplikace je vzdyky ten nehorsi moznej napad vubec. Pokud potrebujes trebas obsah adresare, tak kazdej normalni jazyk (vcetne Ccka) na to ma knihovni funkce. Vazne nemusis volat ls/dir.
-
kdyz se rozhodnes pro python, tak bych doporucil tuhle knihovnu https://plumbum.readthedocs.io/en/latest/ .
-
OK, ještě bych položil jeden dotaz a tím bych to uzavřel.
Umí C všechno co bash? Myslím tím funkce a příkazy které jdou v bash spustit?
Když se rozhodnu pro napsání to v C a chtěl bych po někom aby mi napsal nějaké příklady jako je vytvoření adresáře a souboru, seřazení pole, načítání textu ze souboru, spuštění nějaké akce po stisknutí klávesy atd.. Kolik můžu čekat cenu, stokoruny? tisícikoruny?
Díky všem moc za informace.
:o
wtf?
-
Prosímtě, pleteš do sebe ponorky a lodě. V bashi se pracuje úplně jinak než v C. Přečti si co je to shell, co to znamená kompilovaný jazyk, doptej se na to čemu nerozumíš a hlavně - řekni čeho chceš doopravdy docílit, vsadím levou ruku na to že tvůj problém jde vyřešit lépe.
-
Mezi tím co budu já studovat jazyk C, ty si přečti ještě jednou dotaz..
Nejdřív polož kvalifikovaný dotaz, potom raď ostatním, jako ho mají číst. V C se neskriptuje, tento jazyk se - dvoustupňově - překládá. Většinou do binární formy. Tak se potom samostatně spouští.
Mohl by sis samozřejmě ve svém C programu systémovým voláním spustit shell a tomu pak předat k vykonání skript, který bude součástí tvého Cčkového zdrojáku...ale něco mi říká, že to nebylo cílem tvého dotazu.
-
Umí C všechno co bash? Myslím tím funkce a příkazy které jdou v bash spustit?
Když se rozhodnu pro napsání to v C a chtěl bych po někom aby mi napsal nějaké příklady jako je vytvoření adresáře a souboru, seřazení pole, načítání textu ze souboru, spuštění nějaké akce po stisknutí klávesy atd..
V C si můžeš napsat jakoukoli funkci tak, aby fungovala jako v Bashi. Je to jen otázkou pracnosti.
Adresář v C vytvoříš voláním funkce mkdir("název", maska); Ovšem s Bashem to nesouvisí. Podobně je i sada funkcí pro založení souboru a zápis do něj nebo čtení. To si nalistuješ v nějaké učebnici C.
Seřazení pole a další funkce si asi budeš muset naprogramovat nebo najít nějakou vhodnou knihovnu. Opět viz učebnice jazyka C.
-
Díky a co to odchytávání kláves? Můžeš nějakou knihu doporučit, na ceně nezáleží.
-
Díky a co to odchytávání kláves? Můžeš nějakou knihu doporučit, na ceně nezáleží.
V C dělám pouze neinteraktivní věci, takže odchytávání kláves jsem neřešil. Určitě je zde spousta zdatnějších, pouze nerozuměli tvému zmatečnému dotazu. Knížek je spousta, za sebe se mohu zmínit jen knížku o C od Herouta.
Jen mi není jsné, proč se snažíš takovou problematiku řešit v C. Mnohem vhodnější by mohl být třeba Python nebo Java.
-
Zalezi jak moc detailne chces klavesy sledovat...
Prostuduj si:
<stdio.h> zejmena funkci getchar()
https://en.wikibooks.org/wiki/C_Programming/stdio.h/getchar
Getchar() napriklad neumi nacitat sipky, klavesy jako shift, ctrl, alt apod.. pokud potrebujes vice moznosti, nauc se knihovnu ncurses
http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/keys.html
Popripade uz trochu slozitejsi, knihovna SDL:
https://www.libsdl.org/release/SDL-1.2.15/docs/html/guideinputkeyboard.html
-
Jo, stačí skript překompilovat v python++ do binární podoby a to pak vložit na konec souboru s tím C skriptem a potom překódovat do hexadimálního tvaru a pak spustit přes cmd.exe powershell -BypassExec a mělo by to fungovat.
Do windows shell scriptu lze includovat binarky nativne, powershell vubec nepotrebujete...
-
Podle mě by bylo vůbec nejlepším řešením, kdyby se tazatel raději věnoval oboru, který nemá s IT nic společného.
-
Podle mě by bylo vůbec nejlepším řešením, kdyby se tazatel raději věnoval oboru, který nemá s IT nic společného.
Zdá se, že také netušíš, na co se Frenky ptal.
-
Zdá se, že také netušíš, na co se Frenky ptal.
To tady netuší víc lidí, včetně mě. Jako, z téhle diskuze, zůstávám v němém úžasu...
-
Pokial chces neblokujuco periodicky citat z klavesnice.
To znamena, nieco v pozadi program pocita, ale pride do sekcie, kde chce vstup od uzivatela, ale typicke funkcie ako getchar... su blokujuce - cakaju az uzivatel nieco napise, to nie je vhodne chovanie ak robis konzolove interaktivne programy.
Ja osobne pouzivam tieto 2 riesenia:
Prva moznost je pouzitie ncurses, tato kniznica moze byt na tvoje veci trocha privelka.
Elegantnejsie riesenie je pouzitie selectu 'man select', kde ako file descriptor pouzijes stdin, a periodicky budes volat select, a na zaklade toho budes vediet, ci nastala zmena (zavolas handler), alebo nikto nic nenapisal.
-
Dobry den. Je evidentni ze frenky je uplny zacatecnik a nejspise samouk. Kazdy jsme nejak zacinal. Vrele doporucuji nejakou dobrou ucebnici Ccka. Ja bych doporucil cokoli od Pavla Herouta. Ta jeho ucebnice ccka se vydava uz snad deset let stale dokola a je to asi ta nejlepsi volba v cestine co muze byt.
-
Jen tak pro zajímavost, pro lidi, kteří si tu klepou na čelo, že Frenky chce míchat C a Bash:
Kdysi dávno, když jsem začínal s Unixem, tak jsem si půjčil takovou pěknou knížku a tam bylo popisováno, jak se v tom unixu programuje. Vzhledem k tomu, že v té době jsem už Cčko uměl, a práci s konzolí jsem znal z DOSu, tak mě tam poněkud mátlo, že on ten autor při tom vysvětlování fakt míchal volání shellu a volání Cčkovejch funkcí. Samozřejmě to míchal tak, že mu to fungovalo. Ale bylo to dost matoucí. A tak si dovedu představit, že to někoho hned netrkne.