Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Frenky 30. 11. 2017, 14:38:51

Název: Jak uložit bash funkci do souboru script.c
Přispěvatel: 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
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: ByCzech 30. 11. 2017, 16:05:34
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()...)
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: blah 30. 11. 2017, 16:22:08
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Frenky 30. 11. 2017, 16:22:31
Mezi tím co budu já studovat jazyk C, ty si přečti ještě jednou dotaz..
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Frenky 30. 11. 2017, 16:25:01
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Joe_Black 30. 11. 2017, 16:32:59
Toto musi byt trolling ...
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: samalama 30. 11. 2017, 16:43:05
nie nie, to je len dalsi idiot, co sa ide hrat na it-ckara...
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Ivan Nový 30. 11. 2017, 16:53:31
Tak to je už vrchol bashismu :-)))
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: David1234 30. 11. 2017, 16:55:00
Proč musí být každý kdo se něco učí idiot? Nechápu.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Ivan Nový 30. 11. 2017, 17:01:46
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: samalama 30. 11. 2017, 17:11:26
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...
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Jenda 30. 11. 2017, 18:23:42
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 #.
Kód: [Vybrat]
/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
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Ivan Nový 30. 11. 2017, 19:24:31
@jenda
nejde o to, že se to nedá udělat, ale že je to nekoncepční zvěrstvo
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: i 30. 11. 2017, 21:59:16
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ň ?
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: MartinProkš 30. 11. 2017, 23:21:32
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Frenky 01. 12. 2017, 01:30:08
Mám soubor test.c
v tomto souboru chci mít program napsaný v Cečku (jedna funkce main) a taky 3 bash funkce.

Kód: [Vybrat]
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Jenda 01. 12. 2017, 01:59:59
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é.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Tomas2 01. 12. 2017, 06:26:47
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Ivan Nový 01. 12. 2017, 07:46:17
Ze Stackowerflow https://stackoverflow.com/questions/3736210/how-to-execute-a-shell-script-from-c-in-linux

použijete funkci system, nebo popen

Kód: [Vybrat]
#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;
}
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Ivan Nový 01. 12. 2017, 07:48:59
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: gll 01. 12. 2017, 07:51:47
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
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Tomas2 01. 12. 2017, 09:10:48
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í.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Frenky 01. 12. 2017, 10:29:04
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: tisnik 01. 12. 2017, 10:33:30
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?
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: gll 01. 12. 2017, 10:43:40
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: j 01. 12. 2017, 10:55:41
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: gll 01. 12. 2017, 10:58:14
kdyz se rozhodnes pro python, tak bych doporucil tuhle knihovnu https://plumbum.readthedocs.io/en/latest/ .
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: hawran diskuse 01. 12. 2017, 11:58:49
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?
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Ravise 01. 12. 2017, 12:54:40
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: v2kt0r 01. 12. 2017, 13:25:15
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Kit 01. 12. 2017, 17:31:09
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Frenky 01. 12. 2017, 22:40:09
Díky a co to odchytávání kláves? Můžeš nějakou knihu doporučit, na ceně nezáleží.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Kit 01. 12. 2017, 23:13:46
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: dword 02. 12. 2017, 01:20:44
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
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Unknown 02. 12. 2017, 02:25:01
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...
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: O 02. 12. 2017, 14:01:46
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Kit 02. 12. 2017, 14:15:56
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: starej Paďous 02. 12. 2017, 17:31:25
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...
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: Jozko 02. 12. 2017, 21:25:16
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.

 
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: MartinProkš 03. 12. 2017, 22:30:22
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.
Název: Re:Jak uložit bash funkci do souboru script.c
Přispěvatel: BoneFlute 12. 12. 2017, 16:41:44
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.