C++: std::filesystem falscher Pfad

Gast #6263487
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
Gast #6263503
> 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
#6263532
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.
Gast #6263537
> 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.
Gast #6263544
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.
#6263569
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.
#6263586
> 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
Gast #6263686
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 :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.