c++ pobieranie znaku zachęty

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

c++ pobieranie znaku zachęty

Post autor: maly_wariat »

Witam.
W jaki sposób można skopiować znak zachęty z powłoki(np bash) w cpp?
Tak aby przez cout można było go normalnie wyświetlać tak jak w powłoce?
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: Struchu »

Informacje jak pobierać zmienne środowiskowe z poziomu C++ znajdziesz tutaj:

Kod: Zaznacz cały

man 3 getenv
Znak zachęty z tego co pamiętam jest trzymany w zmiennej PS1.
Ma zielone, kocie oczy...
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

Struchu pisze:Informacje jak pobierać zmienne środowiskowe z poziomu C++ znajdziesz tutaj:

Kod: Zaznacz cały

man 3 getenv
Znak zachęty z tego co pamiętam jest trzymany w zmiennej PS1.
O tym wiem.
Spróbuj
echo $PS1
Ja chcę znak zachęty w takim formacie np
maly_wariat@ubuntu: ~$
a nie
\u@\h:
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: c++ pobieranie znaku zachęty

Post autor: dawidgarus »

Kod: Zaznacz cały

echo $(whoami)@$(hostname): $(pwd|sed "s#$HOME#~#")\$
kklimonda
Zakręcona Traszka
Zakręcona Traszka
Posty: 585
Rejestracja: 20 kwie 2008, 04:21
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME

Odp: c++ pobieranie znaku zachęty

Post autor: kklimonda »

@dawid: Ale to nie wygląda za bardzo jak C++
@wariat: Nie ma czegoś takiego jak pobieranie znaku zachęty w C++. znak zachęty jest rozwijany przez shell na podstawie tego co masz ustawione w zmiennej PS1 i C++ nie ma pojęcia jak on wygląda.
Jedyne co możesz zrobić to samemu napisać kod który będzie rozwijał PS1 do właściwego znaku.
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

No to wracam do początku.
Napisałem taki prosty kod

Kod: Zaznacz cały

#include <iostream>
#include<stdlib.h>

#include<stdio.h>

using namespace std;

int main()
{
	cout<<getenv("PS1")<<endl;
	return 0;	
	

}
Po kompilacji nie zwraca nic.
Ten natomiast zwraca mi błąd, prawdopodobnie dla tego że próbuje wyświetlić coś co nie "istnieje".

Kod: Zaznacz cały

#include <iostream>
#include<stdlib.h>

#include<stdio.h>

using namespace std;

int main()
{
	string z=getenv("PS1");
	cout<<z<<endl;
	return 0;	
	

}
oto błąd
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Aborted
Natomiast drugi problem polega na tym że jeśli w np. SLES istnieje zmienna $HOST to w ubuntu jest już ona pusta. Czyżbym musiał przeszukiwać plik? i z niego sortować nazwę?
Zapomniałem dodać że jeśli zamiast PS1 wstawię np USER to program działa poprawnie.
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: c++ pobieranie znaku zachęty

Post autor: dawidgarus »

@kklimonda, jest c++ jeśli połączymy to z funkcją system, np.:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
int main ()
{
	system("PR=\"$(whoami)@$(hostname): $(pwd|sed s#$HOME#~#)\$\"");
	printf("%s\n", getenv("PR"));
}
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

to odpada na starcie:

Kod: Zaznacz cały

echo $(whoami)@$(hostname): $(pwd|sed "s#$HOME#~#")\$
Ponieważ jeśli zmienię sobie znak zachęty to już mi się nie bedzię pokrywać.
Jeśli już to w jaki sposób odczytać tą zmienną PS1. ?

W sumie to jednak bardzo dobry pomysł

Kod: Zaznacz cały

system("echo $PS1");
to akurat już działa ale nie do końca tak jak bym chciał, zamiast zwracać cały znak zachęty z basha(maly_wariat@itp) to zwraca mi ($), wiem że to już prawie to ale jeszcze czegoś brak. No i przenosi na dodatek do nowej linijki, a tego bym nie chciał.

Kod: Zaznacz cały

system("echo $PS1>tmp");
tylko jak teraz zrobić aby zmienną $PS1 z domyślnej powłoki albo z powłoki której się uruchomi?
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: c++ pobieranie znaku zachęty

Post autor: beluosus »

Kod: Zaznacz cały

SYNOPSIS
       #include <stdlib.h>

       char *getenv(const char *name);

Kod: Zaznacz cały

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char *c = getenv("PS1");
    cout << c << endl;

    return 0;
}

Kod: Zaznacz cały

cmd ;> ./cpp
\[\033[01;31m\]cmd ;>\[\033[00m\] 
Teraz wystarczy sformatować. man bash -> PROMPTING
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

Wszystko było by pięknie. Ale ty pewnie używasz innego systemu niż ubuntu.
W moim wypadku $PS1 tak jak by nie była zmienną środowiskową.
Po wpisaniu export |grep PS1 w konsoli nie zwraca nic.
Jakiej powłoki używasz bash?

Jeśli wykonam

Kod: Zaznacz cały

export PS1=$PS1
wtedy zadziała. Teraz pytanie co zrobić aby to zawsze działał. W każdym przypadku? (nie dodając do .bashrc ani innych takich) żadnego wpisu.
Albo lepiej, w jaki sposób zmienić domyśle środowisko funkcji system() z sh na bash?
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: c++ pobieranie znaku zachęty

Post autor: beluosus »

Cytując bash reference manual:
PS1
The primary prompt string. The default value is ?\s-\v\$ ?.
Więc jeśli nie ma ustawionej zmiennej $PS1 to wiesz jaki prompt dać. Przy okazji może zainteresować Cię równiesz $PROMPT_COMMAND. Polecenie z niego jest wykonywane przed wydrukiem PS1. Zadanie jest raczej specyficznie, chcesz otrzymać dynamiczną wartość drukowaną przez program, która jest zależna od kilku czynników... może zajrzyj do źródła bash'a? Jakoś nie nasuwają mi się żadne prostsze rozwiązania.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

Raczej czytając poradniki ustawiania zmiennej PS1 mniej więcej napisał bym drukowanie znaku zachęty.
Tylko mam jeden problem, w slesie istnieje $HOST a w ubuntu już nie. Nie wiem jeszcze jak pominąć problem.
W jaki sposób mogę zrobić aby polecenia system() nie były wywoływane w sh tylko np w bash?

Jeśli w pliku .bashrc dodam wpis

Kod: Zaznacz cały

export PS1="$"
wtedy program działa zawsze ale jeśli pominę export to znak zachęty również będzie działał ale już program go nie czyta
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: c++ pobieranie znaku zachęty

Post autor: beluosus »

Jeśli chcesz zrobić coś takiego:

Kod: Zaznacz cały

    system("export ASDF=omg");
    system("echo ASDF=$ASDF");
To zapomnij. Ale odpowiadając na Twoje pytanie to można chyba tak:

Kod: Zaznacz cały

system("bash -c \"echo Oto bash\"");
Albo zmienić powłokę w passwd. Poza tym mógłbyś napisać po co Ci takie akrobacje. Nie lepiej cout << "cmd> "? :P
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

beluosus Jeśli chcesz zrobić coś takiego:

Kod: Zaznacz cały

    system("export ASDF=omg");
    system("echo ASDF=$ASDF");

O tym akurat nie myślałem. Dalej zastanawiam się jak uzyskać PS1. Staram się coś wywnioskować ze źródeł basha.
A tak po za tym to taki mój dziwny pomysł:) Jeśli mi się uda go zakończyć to go przedstawię, a na razie zostanie tajemnicą;)
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
mikolajs
Wytworny Kaczor
Wytworny Kaczor
Posty: 352
Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: c++ pobieranie znaku zachęty

Post autor: mikolajs »

\u@\h:\w\$ u mnie to USER@HOST:aktualny_katolg$
Sam wyszukaj te zmienne i podstaw to co podstawia powłoka.
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

mikolajs pisze:\u@\h:\w\$ u mnie to USER@HOST:aktualny_katolg$
Sam wyszukaj te zmienne i podstaw to co podstawia powłoka.
hmm..
nie chce Ci nic pisać, ale nie wnosiłeś nic nowego do tematu. Jak byś uważnie przeczytał to zauważył byś że mam problem z pobraniem tej zmiennej poprzez c++.Jeśli uda mi się ją pobrać to potem już sobie przetworze. Tu nie chodzi o to aby formatowanie PS1 ustawić na stałe. Tylko dynamiczne, (czyli takie które się będzie zmieniać wraz ze zmianą zmiennej PS1).
Zostaje mi wyszukiwać najpierw PS1 jako zmiennej środowiskowej a jeśli nie istnieje to próbować odczytać z pliku .bashr lub .profile.
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
mikolajs
Wytworny Kaczor
Wytworny Kaczor
Posty: 352
Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: c++ pobieranie znaku zachęty

Post autor: mikolajs »

Czyśbyś nie mógł pobrać $USER ani $HOSTNAME, i nie potrafił pobrać aktualnego katalogu???
Awatar użytkownika
maly_wariat
Sędziwy Jeż
Sędziwy Jeż
Posty: 73
Rejestracja: 25 sie 2009, 21:41
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: c++ pobieranie znaku zachęty

Post autor: maly_wariat »

mikolajs pisze:Czyśbyś nie mógł pobrać $USER ani $HOSTNAME, i nie potrafił pobrać aktualnego katalogu???
Cytat:
Napisał mikolajs
\u@\h:\w\$ u mnie to USER@HOST:aktualny_katolg$
Sam wyszukaj te zmienne i podstaw to co podstawia powłoka.

hmm..
nie chce Ci nic pisać, ale nie wnosiłeś nic nowego do tematu. Jak byś uważnie przeczytał to zauważył byś że mam problem z pobraniem tej zmiennej poprzez c++.Jeśli uda mi się ją pobrać to potem już sobie przetworze. Tu nie chodzi o to aby formatowanie PS1 ustawić na stałe. Tylko dynamiczne, (czyli takie które się będzie zmieniać wraz ze zmianą zmiennej PS1).
Zostaje mi wyszukiwać najpierw PS1 jako zmiennej środowiskowej a jeśli nie istnieje to próbować odczytać z pliku .bashr lub .profile.
Czyśbyś nie umiał czytać? Wyraźnie napisałem że nie mam problemu z pobraniem zmiennej $USER, $HOSTNAME tylko z pobraniem zmiennej $PS1 z "basha". Gdyż nie zawsze musi być zmienną środowiskową. Chciałem pominąć przekształcanie z \u@\h\w: na user@host pwd.
Ale widać nie da się tak tego zrobić.
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
mikolajs
Wytworny Kaczor
Wytworny Kaczor
Posty: 352
Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: c++ pobieranie znaku zachęty

Post autor: mikolajs »

PS1 nie jest zmienną środowiskową, tylko zmienną powłoki. Jak uruchomisz program to tworzysz proces potomny który nie posiada tej zmiennej.
Nie ma więc jej w char** environ, nie będzie jej więc w getenv()
Możesz zrobić coś takiego:

Kod: Zaznacz cały

int main(int argc, const char *argv[]) {
  printf("PS1= %s", argv[1]);
  return 0;
}

i wywołać program:

Kod: Zaznacz cały

./program $PS1
możesz też tak jak pisałeś wyszukać jej w .bashrc
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: c++ pobieranie znaku zachęty

Post autor: beluosus »

Chyba to głupi pomysł (ale pomija kwestię formatowania PS1) jednakże można bash'a otworzyć przez popen i odczytać ostatnią linię. Jednak pewnie w "praniu" wyjdzie parę problemów aczkolwiek nie chcę teoretyzować. Jak chcesz to spróbuj. ;)
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości