c++ pobieranie znaku zachęty
- maly_wariat
- 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
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?
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.
- Struchu
- 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
Informacje jak pobierać zmienne środowiskowe z poziomu C++ znajdziesz tutaj:
Znak zachęty z tego co pamiętam jest trzymany w zmiennej PS1.
Kod: Zaznacz cały
man 3 getenv
Ma zielone, kocie oczy...
- maly_wariat
- 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
O tym wiem.Struchu pisze:Informacje jak pobierać zmienne środowiskowe z poziomu C++ znajdziesz tutaj:
Znak zachęty z tego co pamiętam jest trzymany w zmiennej PS1.Kod: Zaznacz cały
man 3 getenv
Spróbuj
Ja chcę znak zachęty w takim formacie npecho $PS1
a niemaly_wariat@ubuntu: ~$
\u@\h:
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
-
- 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
Kod: Zaznacz cały
echo $(whoami)@$(hostname): $(pwd|sed "s#$HOME#~#")\$
-
- 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
@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.
@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.
- maly_wariat
- 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
No to wracam do początku.
Napisałem taki prosty kod
Po kompilacji nie zwraca nic.
Ten natomiast zwraca mi błąd, prawdopodobnie dla tego że próbuje wyświetlić coś co nie "istnieje".
oto błąd
Zapomniałem dodać że jeśli zamiast PS1 wstawię np USER to program działa poprawnie.
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;
}
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;
}
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ę?terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Aborted
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.
-
- 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
@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"));
}
- maly_wariat
- 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
to odpada na starcie:
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ł
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ł.
tylko jak teraz zrobić aby zmienną $PS1 z domyślnej powłoki albo z powłoki której się uruchomi?
Kod: Zaznacz cały
echo $(whoami)@$(hostname): $(pwd|sed "s#$HOME#~#")\$
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");
Kod: Zaznacz cały
system("echo $PS1>tmp");
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
- beluosus
- 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
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\]
- maly_wariat
- 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
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
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?
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
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.
- beluosus
- 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
Cytując bash reference manual:
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.PS1
The primary prompt string. The default value is ?\s-\v\$ ?.
- maly_wariat
- 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
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
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
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="$"
"Dopóki nie skorzystałem z internetu, nie wiedziałem że na świecie żyje tylu idiotów " - S.Lem.
- beluosus
- 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
Jeśli chcesz zrobić coś takiego:
To zapomnij. Ale odpowiadając na Twoje pytanie to można chyba tak:
Albo zmienić powłokę w passwd. Poza tym mógłbyś napisać po co Ci takie akrobacje. Nie lepiej cout << "cmd> "? 
Kod: Zaznacz cały
system("export ASDF=omg");
system("echo ASDF=$ASDF");
Kod: Zaznacz cały
system("bash -c \"echo Oto bash\"");

- maly_wariat
- 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
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.
-
- 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
\u@\h:\w\$ u mnie to USER@HOST:aktualny_katolg$
Sam wyszukaj te zmienne i podstaw to co podstawia powłoka.
Sam wyszukaj te zmienne i podstaw to co podstawia powłoka.
- maly_wariat
- 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
hmm..mikolajs pisze:\u@\h:\w\$ u mnie to USER@HOST:aktualny_katolg$
Sam wyszukaj te zmienne i podstaw to co podstawia powłoka.
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.
-
- 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
Czyśbyś nie mógł pobrać $USER ani $HOSTNAME, i nie potrafił pobrać aktualnego katalogu???
- maly_wariat
- 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
mikolajs pisze:Czyśbyś nie mógł pobrać $USER ani $HOSTNAME, i nie potrafił pobrać aktualnego katalogu???
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.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.
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.
-
- 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
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:
i wywołać program:
możesz też tak jak pisałeś wyszukać jej w .bashrc
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
- beluosus
- 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
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. 

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