Strona 1 z 2
c++ pobieranie znaku zachęty
: 17 mar 2010, 10:29
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?
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 11:42
autor: Struchu
Informacje jak pobierać zmienne środowiskowe z poziomu C++ znajdziesz tutaj:
Znak zachęty z tego co pamiętam jest trzymany w zmiennej PS1.
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 12:27
autor: maly_wariat
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.
O tym wiem.
Spróbuj
echo $PS1
Ja chcę znak zachęty w takim formacie np
maly_wariat@ubuntu: ~$
a nie
\u@\h:
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 13:06
autor: dawidgarus
Kod: Zaznacz cały
echo $(whoami)@$(hostname): $(pwd|sed "s#$HOME#~#")\$
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 13:35
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.
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 14:18
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.
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 14:54
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"));
}
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 15:02
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ł
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?
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 17:23
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
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 17:31
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
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?
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 19:39
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.
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 20:01
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
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
Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 20:57
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:
Albo zmienić powłokę w
passwd. Poza tym mógłbyś napisać po co Ci takie akrobacje. Nie lepiej cout << "cmd> "?

Odp: c++ pobieranie znaku zachęty
: 17 mar 2010, 21:07
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ą;)
Odp: c++ pobieranie znaku zachęty
: 18 mar 2010, 15:10
autor: mikolajs
\u@\h:\w\$ u mnie to USER@HOST:aktualny_katolg$
Sam wyszukaj te zmienne i podstaw to co podstawia powłoka.
Odp: c++ pobieranie znaku zachęty
: 18 mar 2010, 16:40
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.
Odp: c++ pobieranie znaku zachęty
: 19 mar 2010, 19:20
autor: mikolajs
Czyśbyś nie mógł pobrać $USER ani $HOSTNAME, i nie potrafił pobrać aktualnego katalogu???
Odp: c++ pobieranie znaku zachęty
: 20 mar 2010, 08:42
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ć.
Odp: c++ pobieranie znaku zachęty
: 22 mar 2010, 21:25
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:
możesz też tak jak pisałeś wyszukać jej w .bashrc
Odp: c++ pobieranie znaku zachęty
: 22 mar 2010, 21:55
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.
