Strona 1 z 1

Powłoka na linux

: 01 lut 2017, 17:05
autor: nalesnik45
Hej,

potrzebuję napisać prostą powłoke na linuxa z klasami, operującymi na plikach. Nie mam pojęcia od czego zacąć. Mógłby ktoś pomóc ?

Re: Powłoka na linux

: 02 lut 2017, 14:39
autor: enedil
Powłoka powinna być nieskończoną pętlą czekającą na wejście i wykonującą, co zostało podane. Przykład prostej powłoki w Pythonie:

Kod: Zaznacz cały

#!/usr/bin/env python3

from os import getcwd, execvp
from sys import exit

def main():
    while True:
        try:
            line = input("{}$ ".format(getcwd()))
        except EOFError: # ctrl+d
            exit(0)
        args = line.split()
        execvp(args[0], args)

def cd(directory):
    # ...
    pass

# i.t.d.

main()

Re: Powłoka na linux

: 03 lut 2017, 15:25
autor: nalesnik45
okej, napisałam cos takiego....

czy to jest ok, czy raczej poplątane i pomieszane ?

Kod: Zaznacz cały

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fstream>
#include <sstream>
#include <sys/param.h>
#include <sys/types.h>
#include <dirent.h>
#include <fstream>
#include <windows.h>

using namespace std;

int x,t;//
list<string> l;//deklaracja zmiennych
list<string> l1;//
list<string>::iterator it;//dodanie interatora
string nazwa_pliku;//


void data()
{
    SYSTEMTIME time;//struktura SYSTEMTIME i nazwanie jej
   GetLocalTime(&time);//funkcja pobierajaca date,godzine
   HANDLE kolor;
   kolor = GetStdHandle( STD_OUTPUT_HANDLE );

   int godzina = time.wHour;
   int minuta  = time.wMinute;
   int dzien = time.wDay;
   int miesiac = time.wMonth;
   int rok = time.wYear;
   SetConsoleTextAttribute( kolor, 0x0008 );//zmiana koloru czcionki
   cout<<rok<<" "<<dzien<<" "<<miesiac<<" "<<godzina<<":"<<minuta;
   cin.get();

}

void otworz()
{
   string zawartosc_pliku;

   ifstream NowyPlik;
   NowyPlik.open("C:\\plik.txt");
   while(NowyPlik.good())
        {
        getline(NowyPlik, zawartosc_pliku);
        cout<<zawartosc_pliku<<endl;
        }
   NowyPlik.close();

   cin.get();
}

void usun()
{
    char sciezka[MAX_PATH];
    cin>>sciezka;
    remove(sciezka);

    cin.get();
    cin.get();

}

void utworz()
{
    string znak;//deklaracja zmiennej
    cout << " Wpisz swoje notatki ( aby zakoñczyæ wpisywanie w nowej lini wpisz 'wyjdz'" << endl;//komunikat
    while(znak != "wyjdz")
    {
        getline(cin,znak);
        if (znak!="wyjdz")
        {
            l.push_back(znak);
        }
    }
    cout << " Wprowadz nazwe pliku z rozszerzeniem po ." << endl;
    cin >> nazwa_pliku;
    ofstream plik;
    plik.open(nazwa_pliku.c_str());
    cout << " wprowadzenie do pliku" << endl;
    l.pop_front();
    for(it=l.begin() ; it!=l.end() ; it++) /// wpowadzenie zawartosci do pliku
    {
        plik << *it <<endl;
    }
    plik.close();
    cout << " Wyswietlenie twoich notatek" << endl;
    for(it=l.begin() ; it!=l.end() ; it++)
    {
        t++;
        cout << t << " : " << *it << endl;
    }
    t=0;
}

void kopiuj (string NazwaPliku, string sciezka)
{
	int dlugosc=0;
	char *bufor=NULL;

	fstream NowyPlik;
	NowyPlik.open(NazwaPliku.c_str());
	NowyPlik.seekg(0, ios::end);
	dlugosc=NowyPlik.tellg();
	NowyPlik.seekg(0, ios::beg);
	NowyPlik.read(bufor,dlugosc);
	NowyPlik.close();

	ofstream NowyPlik2;
	NowyPlik2.open(sciezka.c_str());
	NowyPlik2.write(bufor, dlugosc);
	NowyPlik2.close();
}

int main()
{
    string p;
    do
    {
        cout << " Wpisz polecenie: " << endl;
        cin >> p;
        if (p!="pomoc")
        {
            if (p=="utworz")
            {
                utworz();
                l.clear();
                l1.clear();
            }
            if (p=="kopiuj")
            {
                kopiuj();
                l.clear();
                l1.clear();
            }

            if (p=="usun")
            {
                usun();
                l.clear();
                l1.clear();
            }

            if (p=="data")
            {
                data();
            }



        }
        else
        {
            if(p=="pomoc")
            {
            cout << "Polecenia:" << endl;
            cout << "data ----- polecenie wyswietla aktualna godzine i date" << endl;
            cout << "utworz ----- polecenie tworzy nowy plik z zawarta zawartoscia" << endl;
            cout << "usun ----- polecenie usuwa z pliku wedlug wierszy zawartosc" << endl;
            cout << "kopiuj ----- polecenie kopiuje jeden plik do drugiego" << endl;
            cout << "wyjdz ----- polecenie zamyka dzialanie programu" << endl;

            }
            else{
            cout << " Zle wpisane polecenie wpisz pomoc, aby wyswietlic liste" << endl;
            }
        }
    }
    while(p!="wyjdz");
    cout << "  Zakonczono program  " << endl;
  return 0;
}

Re: Powłoka na linux

: 04 lut 2017, 20:02
autor: enedil
No, poza tym, że nie jest to powłoka na Linuksa, mniej więcej tak się to robi. Spodziewałem się powłoki typu n.p. bash, ale czemu nie coś, co służy do tworzenia notatek.