Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Ukrštena platforma Shell programiranja


Ch Shell (ch) je C-kompatibilna i izvorna C školjka

Shell programiranje sa pisanim dokumentima je efikasno za procese koji se automatski ponavljaju,kao što su sistem administracija (system administration),regresija test(regression test) i rapid prototyping.Jezička sintaksa uobičajenih Windows MS-DOS i Unix školjki kao što su Bourne shell, C shell, i Korn shell je nepodesna. Slično simboličkim mnemoničkim formama jezika sazdanih na nižem nivou,posebna značenja za skupove metakaraktera u MS-DOS/Unix shell-u su teška za pamćenje.Stoga,pisani dokumenti široke školjke pisani u ovim MS-DOS/ Unix shell programskim jezicima su naporni za čitanje i teški za menjanje i održavanje.Pored toga,kapacitet ovih MS-DOS/Unix shell programskih jezika je ograničen.Kao milioni hard- to-program VCR-a koji trepere 12:00 u dnevnim sobama Amerikanaca, većina MS-DOS/ Unix korisnika upotrebljava samo delić mogućnosti ovih shell programskih jezika.Najveći deo korisnika tretira ove MS-DOS/Unix shells kao prevodioce na komandu;njihovi programski procesi iz dana u dan se obavljaju u C ili nekom drugom uobičajenom programskom jeziku.

Ch je interpretativna implementacija C-a kao Unix/MS-DOS shell-a. ch može da se koristi i kao školjka za logovanje,ista kao Unix školjke.Ch premošćava prazninu između C jezika i Unix/MS-DOS školjke. Unix shell komande kao što su vi, ls, mv, grep, find, awk i sed mogu da operišu podjednako u Ch-u kao u Windows-u i Unix-u,integrisane su u Ch komandu za pisana dokumenta.Dizajnirana je za interaktivnu interpretaciju na komandu,kao i za shell programiranje.Ch je prava VHLL za programiranje dok istovremeno održava shell odlike kao što su komanda-linijsko uređivanje(line editing),upotpunjenje kartice(tab completion), istorija,alijasi,pajping,wildcarding,ponavljanje,itd.Kada se Ch koristi u pojedinačnom komandnom režimu,većina odlika Ch-a su iste kao uobičajene Unix školjke kao što su Bourne shell, C shell i Korn shell,kao i MS-DOS shell u Windows-u.Međutim,od kada je Ch nadskup C-a,shell skripte pisane u C-u i proširene karakteristike Ch shell programiranja su mnogo jače,efikasnije i lake za održavanje.

Dobijanje pomoći
man unix_command -Pročitati uputstvo na unix_command.to jest: 'man ls' da biste videli uputstvo na "ls"
man C_function_name -Pročitati uputstvo na C_function_name. to jest: 'man strcpy' da biste videli uputstvo na C function 'strcpy'


Home direktorijum i globalni znakovi(wildcards)
~
~-Vaš home direktorijum
~username- Home direktorijum za korisničko ime
~/subdirectory - Poddirektorijum(subdirectory) direktoriujm u vašem home direktorijumu
cd - Vraća vas na prethodni direktorijum sa vašeg tekućeg radnog direktorijuma,to jest:ako ste u c:/windows, idite na C:/Program Files/Microsoft, ukucajte 'cd -' da biste se vratili na c:/windows.
cd --Prebacuje vas na prethodni prethodni direktorijum.to jest, ako ste u /usr, idite na /usr/local, zatim idite na /usr/local/bin, ukucajte 'cd --' da biste se vratili na / usr.
cd ~ or cd -Vodi na vaš home direktorijum iz vašeg tekućeg radnog direktorijuma
* -Bilo koji broj od karaktera. to jest: 'ls *.ch' izlistaće sve fajlove koji se završavaju na ch
? -Bilo koji pojedinačan karakter


Istorija da bi se pokazale prethodno izvršene komande
!!
!!-Ponovno izvršenje poslednje komande(ili koristite dole opisanu prečicu sa strelicom)
!number -Izvršenje komande po broju
!string -Izvršenje poslednje komande koja počinje nizom(stringom)
^old^new - Izvršenje poslednje komande, zamena stare novom
ctrl-p -Skrolovanje unazad kroz prethodne komande


Pajpovi i izlazno preusmeravanje

command > filename
-Preusmerenje standardnog izlaza komande da biste pisali preko fajla 'filename'.(naziv fajla)
command >> filename - Preusmerenje standardnog izlaza komande da biste priključili fajlu 'filename'
ch -r command >filename (važi za Windows i Unix)
command >filename 2>&1 (u Unix-u)
command 1>filename 2>&1 (u Windows-u)
-Preusmerenje standardnog izlaza komande (stdout) i standardna greška (stderr) za fajl 'filename'
command < filename -Preusmerenje standardnog ulaza komande da biste čitali iz fajla 'filename'
command1 | command2 - Preusmerenje standardnog izlaza komande 1 na standardni ulaz komande 2


command &-Pokretanje komande u pozadini

Ch Shell protiv C Shell, Bash i Korn Shell-a

U smislu shell programiranja, Ch će biti blizak C shell-u što je moguće više, ali ne bliži od toga. Ch shell je izvorni 'C' shell i prenosiv u Windows i Unix,dok C Shell (csh) nema ništa sličnije od C-a u poređenju sa drugim jezicima kao što su php etc,osim svog imena.Semantika karakteristika istorije i alijasa u Ch-u je slična C-shell-u.Ali sintaksa se razlikuje od C-shell-a,jer je Ch nadskup C-a.Tabela koja sledi naglašava razlike u sintaksi između Ch shell-a i C shell- a,ali sa istom semantikom.

C Shell Ch Shell
$#argv _argc
$argv[*] strjoin(" ", _argv[1], _argv[2], ..., _argv[_argc])
$argv strjoin(" ", _argv[1], _argv[2], ..., _argv[_argc])
$* strjoin(" ", _argv[1], _argv[2], ..., _argv[_argc])
$argv[1-n] strjoin(" ", _argv[1], _argv[2], ..., _argv[n])
$0 _argv[0]
$argv[n] _argv[n]
$1 $2 ... $9 _argv[1] _argv[2] ... _argv[9]
$argv[$#argv] _argv[_argc]
set prompt = "ch> " _prompt = "ch> "
set path = (/usr/bin /bin) _path = "/usr/bin /bin"
umask 022 umask(022)
setenv PATH "/usr/bin /bin" putenv("PATH=/usr/bin /bin")
echo $PATH printf("%s\n", getenv("PATH"))
echo $PATH echo $(getenv("PATH"))
echo $PATH echo $PATH
echo ${PATH} echo ${PATH}
echo $path printf("%s\n", _path)
echo $path echo $_path
unsetenv PATH remenv("PATH")
printenv PATH getenv("PATH")
unset path remvar _path
unset path #pragma remvar(_path)
unset i remvar i
unset i #pragma remvar(i)
set i =90 int i = 90
set i =91 i = 91
set hostnam =`hostname` string_t hostnam =`hostname`
set host =`hostname` _host =`hostname`
alias rm "rm -i" alias("rm", "rm -i")
alias rm alias rm
alias rm alias("rm")
alias alias
alias alias()
unalias rm unalias rm
unalias rm alias("rm", NULL)
alias f "find . -name \!:1 -print" alias("f", "find . -name _argv[1] -print")
alias e "echo \!* \!$ \!#" alias("e", "echo _argv[*] _argv[$] _argv[#]")
eval ls streval("`ls`")
eval ls system("ls")
eval setenv NAME VALUE streval("putenv(\"NAME=VALUE\")")
/usr/bin/ls * /usr/bin/ls *
./cmd -option ./cmd -option
status _status
ls ~ * ls ~ *
ls > output ls > output
ls | tar -cf tarfile ls | tar -cf tarfile
ls $PATH ls $(getenv("PATH"))
ls $PATH ls $PATH
ls $path ls $_path
history = 100 _histsize = 100
history history
$cmd $cmd
!l !l
!l -agl !l -agl
!3 13
!-1 !-1
!! !!
vi `grep -l "str1 str2" *.c` vi `grep -l "str1 str2" *.c`
/* use $ inside ` ` */
set filename="test.txt"
set tmpFilename=$filename
echo `wc -w $tmpFilename`
string_t filename = "test.txt";
string_t tmpFilename = filename;
echo `wc -w $tmpFilename`;
.cshrc .login .logout .chrc .chlogin .chlogout (in Unix),_chrc (u Windowsu)
.cshrc .login .logout .chsrc .chslogin .chslogout (in Unix), _chsrc (u Windowsu)



Bash and Korn Shell Ch Shell
eval $(date "+month='%B' mon='%m' year='%Y'")
echo $month $mon $year
string_t month, mon, year;
streval(`date '+month="%B", mon="%m", year="%Y"'`);
echo $month $mon $year
ls /non_exist_directory >junk 2>&1 ls /non_exist_directory >junk 2>&1
export PS1="\u@\H \W \A >" _prompt=stradd(_user, "@", _host, " ", _cwdn, " ",`date +%k:%M`, " >")



Brzi opis
bash Prompt ch Prompt
Tekući radni direktorijum \w _cwd
Osnovno ime(basename) tekućeg radnog direktorijuma \W _cwdn
Korisničko ime \u _user
Puno ime domaćina (hostname) \H _host
Hostname sve do prvog '.' \h `hostname -s`
Aktuelni history broj \! _histnum
Vreme u danu od 24 sata hh:mm \A `date +%k:%M`



Prečice na tastaturi u Ch shell-u

Copy(kopiranje) i Paste(lepljenje) (dva načina da to uradite):

  • Koristeći konzolu GUI: ako želite da kopirate i lepite u GUI-u, možete da pokrenete "konzolu" iz ch shell-a. to vam omogućava da uradite copy i paste pritiskanjem dugmeta iz GUI-a.
  • Prečica sa korišćenjem miša (ovo rešenje funkcioniše u gore pomenutoj GUI konzoli i u Ch Shell-u): Da naglasite tekst koji želite da kopirate:Pritisnite jednom,sa kursorom na jednoj strain teksta koji želite da kopirate,levim klikom miša.Zadržite dugme na mišu.Zatim vucite strelicu miša preko teksta sve dok ceo tekst koji želite da kopirate ne bude obojen drugačije od ostatka teksta na toj strani.Onda pustite dugme na mišu.Ako ste ga ispravno obeležili,tekst bi trebalo da ostane obojen.
    Za kopiranje: Desni klik na mišu.
    Za lepljenje(paste):Postavite kursor tamo gde želite da uradite paste,zatim desni klik na mišu da biste izvršili paste.
TAB: Automatsko izvršenje imena fajla,komande ili imena direktorijuma iz pozicije kursora.
Trik da biste uredili prostor u imenu fajla ili direktorijumu kada imate višestruke opcije,dodajte znak '\' ispred razmaka ' ',zatim kucajte 'TAB'.to jest:

C:/> cd c:/do[TAB]
Documents/-- Documents and Settings/
C:/> cd c:/Documents\ [TAB]
C:/> cd "c:/Documents and Settings"/

Prednost u Ch shell-u pokretanje "cd [tab]" u ch shell-u će prikazati listu direktorijuma iz kojih možete da selektujete,dok će ostale školjke (shells) kao što bash (verzija 4.1.2) prikazati listu fajlova (koja nije neophodna) i direktorijume.

Ctrl+a: (home) pomera kursor na liniju start (ekvivalentno tasteru Home).
Ctrl+e :(end) pomera kursor na liniju end (ekvivalentno tasteru End).
Ctrl+p: (previous) opoziva prethodnu komandu (ekvivalentno tasteru Up).
Ctrl+n: (next) opoziva narednu komandu (ekvivalentno tasteru Down)
Ctrl+u : briše sadržaj reda ispred kursora i kopira ga na clipboard.
Ctrl+k : : briše sadržaj reda iza kursora i kopira ga na clipboard.
Ctrl+w : briše reč ispred kursora i kopira je na clipboard.
Ctrl+y : (yank) dodaje sadržaj clipboard-s iz pozicije kursora.
Ctrl+d : šalje EOF marker, koji zatvra aktuelnu školjku (ekvivalentno komandi exit)ukoliko nema teksta u aktuelnom redu.
Ctrl+c : šalje signal SIGINT tekućem procesu, koji se prekida i zatvara ga.
Ctrl+z (dostupan samo u unix-u): šalje signal SIGTSTP tekućem procesu, koji ga obustavlja. Za izvršenje istog u pozadini može se uneti bg. Za vraćanje iz pozadine, može se izdati komanda za prednji plan fg ('process name or id').

Ch dodaci C-u za Shell Programiranje i pisanje dokumenata

Ch proširuje C putem sledećih karakteristika, koje ga čine naročito pogodnim za shell programiranje i ukrštenu platform pisanja dokumenata.
  • Ch se može koristiti podjednako u shell komandi i interpretativno programskom modusu.
    Ch jezičko okruženje se može koristiti kao shell komanda.U shell komandi,zamena istorije,pokazivač događaja,brza zamena,zamena komandi,alijasi,i završavanje imena fajla ili direktorijuma korišćenjem tastera tab su dostupni i u Ch-u.Primer Ch školjke na delu je dat kako sledi:
       > hello.c
       Zdravo, svete!
       (izvedite čuveno hello(zdravo).c program bez kompilacije)
       > int i, *p;
       > p = &i; 
       > *p = 90;
       > printf("i = %d\n", i);
       i = 90
       >if (i == 90) printf("good\n"); else printf("bad\n");
       good
       > int **p2
       > p2 = &p
       > printf("**p2 = %d\n", **p2)
       **p2 = 90
       > ls * > junkfile
       (all file names go to junkfile)
       > i**p
       8100
       > array int a[2][3]
       > a = (array int [2][3])5
       > a
       5 5 5 
       5 5 5
       > 2*transpose(a)
       10 10 
       10 10 
       10 10 
       > which ls
       ls is aliased to ls -F  // if ls is an alias set in ~/[_]chrc
       >
       > int i;
       > for (i=0; i<6;i++) printf("%d\n",i);
        0
        1
        2
        3
        4
        5
       >
    
  • POSIX
    Ch podržava POSIX za direktorijum unakrsne platforme i obradu datoteke.Šifra uzorka se može naći ovde .

  • Tip niza podataka
    C je mali jezik; on nema tip niza podataka. Pokazivači karaktera se obrađuju kao nizovi u C-u.Ch obezbeđuje alternativni tip niza podataka za pokazivače.On eliminiše moguće bagove pre nego što se dese.Tip niza podataka takođe može da se koristi sa postojećim C funkcijama i C tipom podataka ‘pokazivača karaktera’.Za shell programiranje,tip niza podataka je dodat C-u u Ch-u.Neprimetno je spojen sa pokazivačem karaktera.Sve funkcije definisane u standardnom nizu.h zaglavlja C datoteke,važe podjednako za pokazivače karaktera i nizove.Niz je prvorazredni objekat u Ch-u.Na primer,fragment šifre koji sledi
         string_t s, a[3];
          s = "great string"
          s = stradd("greater ", s)
          strcpy(a[0], s);
          printf("a[0] = %s\n", a[0]);
    
    će prikazati veći veliki niz.

  • Za svaki-dodat je okvir za ponavljanje školjke.
    Šifra dole će stvoriti tri direktorijuma dir1, dir2 i dir3 u aktuelnom direktorijumu.
        string_t token, str="dir1 dir2 dir3";
        foreach(token; str) {
           mkdir $token;
        }
    

  • Dokument ovde i Verbatim izlaz. Dokument ovde i verbatim izlaz karakteristike se mogu postići korišćenjem karakteristike blokiranja šifre funkcije fprintf.Dole pomenuta Ch funkcija sendApplet() stvara C program.
    void sendApplet(char *x, char *y, char *expr) { fprintf(stdout, "#include<stdio.h>\n"); fprintf(stdout, "int main() {\n"); fprintf(stdout, " double x = %s;\n", x); fprintf(stdout, " double y = %s;\n", y); fprintf(stdout, " printf(\"x = %%f, \", x);\n"); fprintf(stdout, " printf(\"y = %%f \\n\", y);\n"); fprintf(stdout, " printf(\"%s = %%f\\n\", %s);\n", expr, expr); fprintf(stdout, "}\n"); } Gore pomenuta funkcija sendApplet() se može prepisati u Ch kao što sledi. Ako želite da preusmerite u fajl umesto 'stdout',možete prosto da otvorite fajl i zamenite dole pomenuti 'stdout' svojim fajl handler-om.
    void sendApplet(char *x, char *y, char *expr) { fprintf stdout << ENDFILE #include<stdio.h> int main() { double x = $x; double y = $y; printf("x = %f", x); printf("y = %f\n", y); printf("$expr = %f\n", $expr); } ENDFILE }

  • Varijabla kontrole zamene i stanja spisa može biti niz u dodatku integralnom tipu.
    #!/bin/ch char *ch="SoftIntegration Ch"; float version=2; string_t hostname=`hostname`; switch (hostname) { case "mymachine": printf("Hello world\n"); break; case "testmachine": fprintf stdout << ENDPRINT Welcome to use $ch version $version SoftIntegration, Inc. ENDPRINT echo Ch is cool! I can now use a C program to backup files dump 0ubdsf 80 50000 50000 /dev/nrst0 /dev/sd0a break; default: break; }

  • Varijabla zamene i zamene komande sa kombinacijom shell komandi i C koda
    Shell komande kao što su sed, awk, wc, grep, itd. se mogu kombinovati sa C kodom u cilju rada u Ch-u sa zamenom varijable i zamenom komande.Programi koji se mogu izvršiti se takođe mogu koristiti direktno u Ch piasnom dokumentu.Ispod je primer: #!/bin/ch string_t result1; char result2[50]; grep "test" myfile.txt; if ( _status == 0 ) { printf(" 'test' is found in myfile.txt\n"); } else { printf("Cannot find 'test' in myfile.txt\n"); } result1=`wc -l /etc/passwd`; echo $result1; strcpy(result2, `wc -l /etc/passwd`); printf("%s\n", result2);
    Izlaz za result1 I result2 su isti u gore pomenutom programu.

  • Sigurni Ch je dizajniran za rastuću potrebu za internet računarstvom.
    Dodatno restrikcijama nametnutim od strane uobičajeno ograničene školjke,mnoge druge karakteristike za internet računarstvo preko-mreže su onemogućene u sigurnom Ch-u.Sistem administrator može da garantuje limitirani pristup korisnicima koji upotrebljavaju sigurni Ch.

  • Sistem varijable _argc i _argv za komandnu liniju argument interface.
    Sistem varijable _argc i _argv su ekvivalentne znakovima argc i argv u startup C funkciji

    int main(int argc, char *argv[]);

    Pretpostavimo da program cpfile.ch sadrži sledeće iskaze.
        #!/bin/ch
        cp /dir/source/$(_argv[1]) /dir/dest/
    
    Program cpfile.ch se može koristiti za kopiranje bilo kojeg fajla lociranog u direktorijumu /dir/source u direktorijum /dir/dest. Na primer,komande koje slede
        > cpfile file1
        > cpfile file2
    
    će kopirati fajlove file1 i file2 iz direktorijuma /dir/source u direktorijum /dir/dest.

Više primera

  • Primer 1
    Sledeći Ch shell pisani dokument se može koristiti da podrži fajl sisteme.
      #include<stdio.h>
      int main () {
        printf("Hello, world!\n");
        echo Ch is cool! I can now use a C program to backup files
        dump 0ubdsf 80 50000 50000 /dev/nrst0 /dev/sd0a
      }
    

  • Primer 2
    Dole pomenuti primer će ispisati sve pod-direktorijume i fajlove u aktuelnom direktorijumu,kao i čitavu putanju komande za komandu gzip.
    
         #!/bin/ch
         #include <stdio.h>
         char *s;
         int i=0;
         foreach (s;`ls`) {
            i++;
            echo $s;
         }
         printf("the total number of directory and files are %d\n",i);
         s =`which gzip`;
         echo $s;
    
    

  • Primer 3
    Dole je još jedan uzorak shell pisanog dokumenta.
      #!/bin/ch
      int main() {
        char *s = "pointer to char";
        int i; 
        float f, *p;
        f = 6; 
        p= &f;
        printf("s = %s\n", s);
        printf("*p = %f\n", f);
        /* output from the following statement is "6 6 pointer to char o" */
        echo $f $(*p) $s $(*(s+1));
        pwd
        ls > junk
      }
    

  • Primer 4
    Sledećim shell komandama u Bourne Shell-u sh
    #!/bin/sh command argument << EOF input from the console command line abcd EOF se može rukovati u Ch-u kao što sledi:
    #!/bin/ch #include <stdio.h> FILE *fp; string_t command_args="input from the console command line\nabcd"; fp = popen("command", "w"); fwrite(command_args, strlen(command_args), sizeof(char), fp); pclose(fp);

  • Primer 5
    Prelistajte sve komande dostupne bilo gde na vašoj putanji u Unix-u.
    #!/bin/ch #include <unistd.h> string_t dir, file; /* define string type */ foreach (dir; `echo $PATH | tr ":" " "`) { foreach (file; `ls $dir`) { if (access (dir/file, X_OK) ==0 ) { echo $dir/$file; } } }

  • Primer 6
    Nađite i sakupite sve.c fajlove u .o u aktuelni direktorijum kada je .o star ili odsutan.
    #!/bin/ch #include <sys/stat.h> struct stat cstat, ostat; string_t c, o; foreach (c; `find . -name "*.c"`) { o=`echo $c | sed 's/.c$/.o/'`; stat(o, &ostat); stat(c, &cstat); if (ostat.st_mtime > cstat.st_mtime) { echo "compiling $c to $o"; gcc -c -o "$o" "$c"; } }

  • Primer 7
    Koristi awk u Ch shell-u.
    cat file_name | awk "{print \$1}" awk "{print \$1}" < file_name




Published (Last edited): 29-08-2012 , source: http://www.softintegration.com/docs/ch/shell/