Forum: PC-Programmierung C++: std::filesystem falscher Pfad


von C++Love (Gast)


Lesenswert?

Hallo,

kurze Frage, wenn ich über ein shell-skript (#!/bin/sh 
x-terminal-emulator usw...) ein Programm öffne und den Programmpfad per 
std::filesystem::current_path() anzeigen lasse dann entspricht dieser: 
"/home/user" und ist damit falsch. Statt dem echten Programmpfad bekomme 
ich den Userpfad.

Hat jemand eine Idee wie ich per std::filesystem den korrekten Pfad 
erhalte?

Grüße

von g457 (Gast)


Lesenswert?

> wenn ich über ein shell-skript (#!/bin/sh x-terminal-emulator usw...)
> ein Programm öffne und den Programmpfad per std::filesystem::current_path()
> anzeigen lasse dann entspricht dieser: "/home/user" [..]

also in "/home/user" ausgeführt?

> [..] und ist damit falsch.

Klingt nicht so.

> Statt dem echten Programmpfad bekomme ich den Userpfad.

std::filesystem::current_path() liefert das cwd, also alles bestens.

HTH

von Rolf M. (rmagnus)


Lesenswert?

C++Love schrieb:
> kurze Frage, wenn ich über ein shell-skript (#!/bin/sh
> x-terminal-emulator usw...) ein Programm öffne und den Programmpfad per
> std::filesystem::current_path() anzeigen lasse dann entspricht dieser:
> "/home/user" und ist damit falsch.

Warum ist das falsch?

> Statt dem echten Programmpfad bekomme ich den Userpfad.

Was meinst du mit "echten Programmfad"? Du bekommst das aktuelle 
Arbeitsverzeichnis, was in so einem Fall üblicherweise das 
Home-Verzeichnis ist.

von C++Love (Gast)


Lesenswert?

> also in "/home/user" ausgeführt?

Nein natürlich nicht daher die Frage, das Programm liegt ganz woanders 
als "/home/user".
Das shell-skript welches Programmpfad enthält liegt auf dem Desktop 
damit ich von dort das Programm starten kann.
Der durch std::filesystem::current_path() ermittelte Pfad ist falsch 
denn er zeigt das user-Verzeichnis und nicht den korrekten Pfad.

von C++Love (Gast)


Lesenswert?

ok nochmal Beispiel:

Das Programm befindet sich in:
/home/user/data/projekt8/v2/program

Aber std::filesystem::current_path() gibt raus:
/home/user


Der echte Pfad ist im shell-skript und das shell-skript liegt auf dem 
Desktop damit ich von dort das Programm starten kann.

von Rolf M. (rmagnus)


Lesenswert?

C++Love schrieb:
>> also in "/home/user" ausgeführt?
>
> Nein natürlich nicht daher die Frage, das Programm liegt ganz woanders
> als "/home/user".

In welchem Verzeichnis das Programm liegt, ist für die Funktion egal.

> Der durch std::filesystem::current_path() ermittelte Pfad ist falsch
> denn er zeigt das user-Verzeichnis und nicht den korrekten Pfad.

Nein, der ist richtig. Er entspricht dem Arbeitsverzeichnis. Was falsch 
ist, ist deine Annahme, dass es der sein müsse, wo die ausführbare Datei 
des Programms liegt.

von Martin K. (mk279)


Lesenswert?

> Aber std::filesystem::current_path() gibt raus:
> /home/user

Ich sehe bei dem geschilderten Verhalten kein Problem. Du verwechselst 
wahrscheinlich (1) den aktuellen Pfad mit (2) dem Pfad, wo das 
Executable gespeichert ist.

Siehe auch 
https://stackoverflow.com/questions/4025370/can-an-executable-discover-its-own-path-linux

(1) kann sehr wohl mit std::filesystem::current_path() abgefragt werden;
(2) wohl am bequemsten über das Auslesen des Links von /proc/self/exe, 
siehe stackoverflow. Einfach mal ausprobieren mit
1
ls -al /proc/self/exe
 oder
1
readlink /proc/self/exe

Probiere in einer Shell (unter X z.B. xterm, konsole, gnome-terminal, 
...), das aktuelle Verzeichnis zu wechseln und dann Dein Executable 
auszuführen, was std::filesystem::current_path() aufruft; z.B.
1
cd /
2
/home/user/Desktop/executable

und dann
1
cd /home/user/Desktop
2
/home/user/Desktop/executable

von C++Love (Gast)


Lesenswert?

Ok danke vestehe, mein Ziel war der Pfad wo das Executable gespeichert 
ist. Hatte gedacht std::filesystem::current_path() liefert dies aber 
dann scheint std::filesystem das leider gar nicht zu beherrschen.

Mit /proc/self/exe funktioniert es :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.