ubuntuusers.de

Bash-Skript: pwd Pfad zerlegen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Matthias81

Anmeldungsdatum:
23. Juli 2009

Beiträge: 42

Wie kann ich am einfachsten den letzten Verzeichnis-Teil von "pwd" in einer Shell-Variable ablegen ?

Beispiel: pwd-Ausgabe: /usr/include/sys

In der Shell-Variablen soll "sys" stehen.

(Ich möchte also den Inhalt der Ausgabe nach dem letzten "/" in die Variable kopieren ...)

Danke für eure Hilfe !

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

basename $(pwd) 

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

variable="${PWD##*/}"

Matthias81

(Themenstarter)

Anmeldungsdatum:
23. Juli 2009

Beiträge: 42

In einer "echten" Shell funktioniert der Aufruf. Innerhalb eines Makefiles funktioniert der Aufruf leider nicht:

1
2
3
4
5
6
7
PWD      = `pwd`
APP_PATH = `basename ${PWD}`

.PHONY: backup

backup:
	echo ${APP_PATH}

Ich bekomme folgende Ausgabe:

echo `basename `pwd``
basename: fehlender Operand
„basename --help“ gibt weitere Informationen.
pwd

Habt Ihr eine Idee ?

RapaNui

Avatar von RapaNui

Anmeldungsdatum:
16. Juli 2007

Beiträge: 1925

Wohnort: Penco / Chile

Matthias81 schrieb:

In einer "echten" Shell funktioniert der Aufruf. Innerhalb eines Makefiles funktioniert der Aufruf leider nicht:

1
2
3
4
5
6
7
PWD      = `pwd`
APP_PATH = `basename ${PWD}`

.PHONY: backup

backup:
	echo ${APP_PATH}

Ich bekomme folgende Ausgabe:

echo `basename `pwd``
basename: fehlender Operand
„basename --help“ gibt weitere Informationen.
pwd

Habt Ihr eine Idee ?

Du vermischt hier etwas, wenn ich das richtig sehe, benutze entweder

basename $(pwd)

oder

variable="${PWD##*/}"   #siehe man:builtins

und nicht eine Mischung aus backticks ` und verschiedenen Klammertypen ( {

Matthias81

(Themenstarter)

Anmeldungsdatum:
23. Juli 2009

Beiträge: 42

Wenn ich das Makefile ohne Backticks etc. schreibe bekomme ich folgende Ausgabe:

1
2
3
4
5
6
7
PWD      = pwd
APP_PATH = basename $(PWD)

.PHONY: backup

backup:
	echo $(APP_PATH)

Ausgabe:

echo basename pwd
basename pwd

Kann ich in einem Makefile überhaupt solche Bash-Konstrukte verwenden ?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

Matthias81 schrieb:

Wenn ich das Makefile ohne Backticks etc. schreibe bekomme ich folgende Ausgabe:

Backticks sind deprecated, aber d.h. nicht, daß man sie einfach wegläßt.

APP_PATH=$(basename $(PWD))

Die $(foo)-Schreibweise kannst Du problemlos schachteln, weswegen man diese verwenden sollte.

Backticks können bei ungünstigen Schriften leicht mit Apostrophs verwechselt werden, das spricht auch gegen diese.

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Ein Makefile ist kein Shell-Skript, kann aber Shell-Code enthalten. Es ist wichtig, sich darüber klar zu sein, ob man gerade Shell- oder Make-Code schriebt, und das Zusammenspiel zwischen beiden ist nicht immer ganz einfach zu durchschauen.

In Make ist $(foo) das gleiche wie ${foo}, nämlich die Variable namens foo. Um die Ausgabe eines Shell-Befehls einer Variablen zuzuweisen nimmt man

VAR = $(shell befehl)

oder

VAR := $(shell befehl)

je nachdem, welche Art von Variablen man haben will.

Matthias81

(Themenstarter)

Anmeldungsdatum:
23. Juli 2009

Beiträge: 42

Leider bekomme ich es in einem Makefile nicht hin:

1
2
3
4
5
6
APP_PATH=$(basename $(PWD))

.PHONY: backup

backup:
	echo $(APP_PATH)

Ausgabe:

user@eee:~$ make
echo /home/user
/home/user

Ich erwarte eigentlich die Ausgabe "user" ...

Wie handhabt Ihr das eigentlich in der Praxis: legt Ihr für Aufgaben wie "Debugger aufrufen, kopieren aufs Zielsystem, backup etc." Make-Targets an, oder schreibt Ihr euch separate Skripte ?

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Matthias81 schrieb:

Leider bekomme ich es in einem Makefile nicht hin:

1
2
3
4
5
6
APP_PATH=$(basename $(PWD))

.PHONY: backup

backup:
	echo $(APP_PATH)

Hier rufst du die make-Funktion basename auf, die entfernt nur das Dateinamen-Suffix.

Wenn PWD eine Make-Variable ist:

APP_PATH=$(shell basename $(PWD))

Wenn du die Shell-Variable $PWD verwenden willst:

APP_PATH=$(shell basename $$PWD)

Wie handhabt Ihr das eigentlich in der Praxis: legt Ihr für Aufgaben wie "Debugger aufrufen, kopieren aufs Zielsystem, backup etc." Make-Targets an, oder schreibt Ihr euch separate Skripte ?

Kommt bei mir normalerweise ins Makefile, damit vorher alle Dateien aktualisiert werden.

Matthias81

(Themenstarter)

Anmeldungsdatum:
23. Juli 2009

Beiträge: 42

Vielen Dank für eure Hilfe !

Folgende Version funktioniert:

1
2
3
4
5
6
APP_PATH=$(shell basename $$PWD)

.PHONY: backup

backup:
	echo $(APP_PATH)
Antworten |