Verzeichnis wird restauriert?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Verzeichnis wird restauriert?

Beitrag von slesa » 30.03.2007 23:49:56

Ich hab hier eine Frage und weiß eigentlich nicht wohin damit: ich hab ein Programm nach Art des guten alten Norton-DOS-Programms namens ncd geschrieben. Es liest ein Verzeichnis ein, und wenn ich es mit einem Namen aufrufe, sucht es den in der Liste. Vielleicht gibts das schon, war mir aber erstmal egal. Das klappt soweit auch wunderbar, aber nur bis zum Programm-Ende. Danach steh ich wieder an dem Punkt, an dem ich das Programm gestartet habe. Aber wer restauriert diesen Pfad?
Aktuell teste ich es mit Kubuntu und Konsole, programmiert ist es mit Qt 4.

PS: Falls es das Programm schon gibt: ich brauche es so, daß die Verzeichnisse zu Gruppen zusammengefaßt sind. Darunter gibts nämlich oft die selben Verzeichnisse ("debug" o.ä.)...

Edit: zur näheren Erläuterung (p sei das gefunden Vz.)
QDir::setCurrent(p);
QProcess::execute("pwd");
QProcess::execute("ls");
läuft, ich sehe das gewünschte Vz. Danach beendet sich das Programm, und ich stehe wieder im urspr. Laufvz.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 31.03.2007 00:37:34

das "current directory" braucht für den aufrufenden Prozeß nicht restauriert zu werden, für diesen hast du es nie verändert.
Ich hoffe das folgende Beispiel verdeutlicht das:

Code: Alles auswählen

root@debi:~# cat x.c
int main() {
 chdir("/home");
 system("pwd");
}
root@debi:~# gcc -o x x.c
root@debi:~# ./x
/home
root@debi:~#
edit: wahrscheinlich hat sich meine Hoffnung nicht erfüllt :), in der Zwischenzeit hast du ein ähnliches Beispiel angefügt

Gruß
gms

slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Beitrag von slesa » 31.03.2007 16:29:57

gms hat geschrieben: edit: wahrscheinlich hat sich meine Hoffnung nicht erfüllt :), in der Zwischenzeit hast du ein ähnliches Beispiel angefügt
Ich geb aber gerne zu, daß deins hübscher ist :-)
Aber besteht denn eine Möglichkeit, das aktuelle Verzeichnis der Shell zu ändern? Wenn ich jetzt noch unter Dos wär, würd ichs ja in den Tastaturpuffer schreiben... aber es wird hoffentlich sauberer gehen (?)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 31.03.2007 18:36:36

vielleicht gefällt dir diese Lösung:

Code: Alles auswählen

root@debi:~# cat x.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char*argv[]) {
 if ( argc<2 )
   printf("/home");
 else
   printf("/home/%s",argv[1]);
}
root@debi:~# function mycd() { cd `/root/x ${@+"$@"}`; }
root@debi:~# mycd gms
root@debi:/home/gms#
Gruß
gms

slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Beitrag von slesa » 31.03.2007 21:38:52

gms hat geschrieben:vielleicht gefällt dir diese Lösung:
Wenns nicht anders geht werd ich das wohl so machen müssen. Allerdings wäre mir eine "integrierte" Lösung lieber, weil das Programm auch Stati ausgibt bzw auch andere Kommandos kennt, zB "ncd read" um das Vz neu einzulesen oder ncd group um einen anderen Namensraum zu nutzen.
Wär schade, wenn ich zusätzlich noch ein Skript basteln müßte...

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 31.03.2007 22:11:30

Die "Norton Utilities" habe ich Seinerzeit zwar auch sehr häufig benötigt, unter dem "ncd" kann ich mir aber nicht mehr sehr viel vorstellen.
Im letzten Linux-Magazin wurde dieses Tool vorgestellt:
http://micans.org/apparix/ hat geschrieben: Apparix allows fast file system navigation by bookmarking directories and jumping to a bookmark directly.
Ich habe es kurz einmal getestet und mich tierisch darüber gefreut und möchte es jetzt, sobald ich dazu komme, auch auf allen meinen Workstations/Servern einsetzen. Aber auch dieses Tool benötigt Shell-Funktionen oder -Aliases.
Vielleicht gefällt es dir ja auch, oder vielleicht schreibst du ein OpenSource Programm und stellst es hier einmal vor 8)

Gruß
gms

slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Beitrag von slesa » 31.03.2007 22:47:32

gms hat geschrieben:Die "Norton Utilities" habe ich Seinerzeit zwar auch sehr häufig benötigt, unter dem "ncd" kann ich mir aber nicht mehr sehr viel vorstellen.
naja, "ncd mylib" hat in seiner DB nachgeschaut, wo das liegt, und ist dann nach c:\src\meins\alt\bib\mylib gewechselt. Das war das einzigste Tool, was mich beeindruckte. Ansonsten haben die die PC-Tools besser gefallen.
gms hat geschrieben: Apparix allows fast file system navigation by bookmarking directories and jumping to a bookmark directly.
Kann ich mir nicht vorstellen, weil ich wie gesagt, Gruppen brauche und die Maus am liebsten aus dem Fenster schmeissen möchte. Das nimmt so viel Zeit weg. Gruppe deshalb, weil ich unter src/ die verschiedenen Branches liegen hab, und dort existieren die Verzeichnisse doppelt und dreifach, klar.
Deshalb:
ncd group v1.2; ncd mylib
und fertig.
gms hat geschrieben: vielleicht schreibst du ein OpenSource Programm und stellst es hier einmal vor 8)
/quote]

Alle diese Tools sammel ich und stell sie auf Sourceforge unter qhelpers zur Verfügung. Bisher gibts ein Maker-Tool (das wurde so ähnlich auch mal im LM vorgestellt), einen Release-Note-Editor, Versions-Code-Generator, einen Installer für Windoof (alle Programme auf einmal installieren, ausser natürlich die von M$, die wollen ja neu booten), einen which-Befehl für Windoof und einen Umgebungs-Switcher für die Registry (mehrere QT-Versionen und wechsel dazwischen o.ä.) Aber den muss ich nochmal überdenken.

Für Hilfe zum Anpreisen der Prggis wär ich natürlich dankbar ;-)

Benutzeravatar
npi
Beiträge: 567
Registriert: 03.08.2003 17:52:10

Beitrag von npi » 01.04.2007 00:59:47

@gms, apparix scheint wirklich interessant zu sein, hab's jetzt auch mal installiert, vor allem in Verbindung mit shell-completion kann's einem bestimmt ne Menge Schreibarbeit sparen.
Für die zshell hab ich mal noch eine einfache Completion-Regel definiert:

Code: Alles auswählen

#compdef to

_apparix_aliases ()
{  
    compadd - ` cat $HOME/.apparix{rc,expand} | grep "j,.*$PREFIX.*," | cut -f2 -d, `
    return 0
}
das ganze in eine Datei _apparix_aliases in /usr/local/share/zsh/site-functions/_apparix_aliases, abgespeichert, und schon kann's los gehen ;-)

@slesa, keine Angst, bei dem Programm brauchst du keine Maus, die Bookmarks sind eher als aliases zu verstehen

gruß,
npi
"Bis zur Unendlichkeit, und noch viel weiter!"
--Buzz, Toystory

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 01.04.2007 02:00:21

gms hat geschrieben:Im letzten Linux-Magazin wurde dieses Tool vorgestellt:
http://micans.org/apparix/ hat geschrieben: Apparix allows fast file system navigation by bookmarking directories and jumping to a bookmark directly.
Ich habe es kurz einmal getestet und mich tierisch darüber gefreut und möchte es jetzt, sobald ich dazu komme, auch auf allen meinen Workstations/Servern einsetzen.
Hab das (zugegebenermaßen kleine) Tool mal in ein Paket gepackt und werde zusehen, dass es bald in Debian landet.
Wenn jemand die Pakete jetzt schon haben will, könnte ich sie zur Verfügung stellen...
Siehe auch http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=414278

@slesa:
Hier mal ein Schnipsel aus der Manpage, ist das das was du willst?
subdirectory specification

When jumping (apparating) you can specify an additional subdirectory after the bookmark. Apparix will append the subdirectory to the destination.

This is useful for projects with directory nodes corresponding with versions. Assume you have a directory structure such as this:

/x/y/z/OpusMagnum/v1/
/x/y/z/OpusMagnum/v2/
/x/y/z/OpusMagnum/v3/

It is probably easiest to simply bookmark the OpusMagnum directory in some way (say with bookmark om). You can then issue to om v2 to jump to OpusMagnum/v2. This is more flexible and maintainable then creating bookmarks om1, om2, om3. One could add OpusMagnum as a portal, but with generic names such as v1 this is not a very extendible approach.

See also the tab completion description below - it is possible to tab-complete on subdirectories of the apparix jump directory.
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.04.2007 15:49:10

trigger hat geschrieben: Hab das (zugegebenermaßen kleine) Tool mal in ein Paket gepackt und werde zusehen, dass es bald in Debian landet.
super, auch kleine Dinge können Freude machen :)
Von was hängt die Verfügbarkeit in Debian dann eigentlich noch ab ? Muß der Upload nach Unstable oder Experimental noch warten bis Etch draußen ist, oder muß das noch irgendwie genehmigt werden ?

Gruß
gms

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 01.04.2007 23:24:20

Hi gms!

Das Problem ist nur, dass ich kein DD bin und daher noch einen Sponsor brauche. Ich bin aber sehr optimistisch, dass das klappt...
Desweiteren wollte ich noch ein klitzekleines bißchen am Paket feilen (README.Debian schreiben zum Beispiel).
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Beitrag von slesa » 02.04.2007 10:19:36

Trigger. hat geschrieben: Hier mal ein Schnipsel aus der Manpage, ist das das was du willst?
Allein das "Bookmark" scheint schon nicht das zu sein, was ich will. Ich mals mal kurz an. Gegeben sei eine Verzeichnisstruktur wie folgt:

Code: Alles auswählen

~/sources/daniela/src/lib/basics
~/sources/daniela/src/lib/lolevel
~/sources/daniela/src/lib/hilevel
~/sources/edina/src/lib/basics
~/sources/edina/src/lib/lolevel
~/sources/edina/src/lib/hilevel
~/sources/head... usw
daniela, edina und head sind die jeweiligen Versionen bzw Branches.
Mein Ziel wärs jetzt mittels

Code: Alles auswählen

ncd group edina
ncd lolevel
direkt in das Unterverzeichnis zu springen. Aber wenn Apparix Bookmarks benutzt heisst das doch, dass ich die erstmal alle einlesen müßte, oder nicht? Mein Programm liest erstmal das komplette Vz ein... so wie ncd früher auch.


Befindet sich eigentlich ein QT-Entwickler unter uns? Der mir vielleicht bei der "Vermarktung" der Tools helfen möchte?

slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Hilfe beim Scripten

Beitrag von slesa » 02.04.2007 11:10:42

Also irgendwie bekomm ich das Skript nicht so hin. Mir fehlt die Fehlerüberprüfung, falls der Pfad nicht existiert.

Code: Alles auswählen

#!/bin/sh

case "$1" in
help|read|group)
        ncd.exe $1 $2 $3
        ;;
*)
        cd 'ncd.exe $1'
        ;;
esac
Mit fehlt sowas wie $var = 'ncd $1'. Weiß jemand Abhilfe?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Hilfe beim Scripten

Beitrag von gms » 02.04.2007 13:52:38

slesa hat geschrieben: Mit fehlt sowas wie $var = 'ncd $1'. Weiß jemand Abhilfe?
suche dir eins aus:

Code: Alles auswählen

var=`ncd $1` 
var=$(ncd $1)
Gruß
gms

slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Geht nicht...

Beitrag von slesa » 02.04.2007 14:26:03

Ist da irgendwas falsch dran? - Offensichtlich, sonst ginge es ja...

Code: Alles auswählen

        var=$(ncdbin $1)
        if [ "$?" -ne 0 ]; then
                echo "Cancelled"
                exit 1;
        fi
        echo $var
        cd $var
Das letzte cd geht irgendwie nicht...

Dafür funktioniert dein function-Einzeilerer vorzüglich... aber was bedeutet $@?

Benutzeravatar
npi
Beiträge: 567
Registriert: 03.08.2003 17:52:10

Re: Geht nicht...

Beitrag von npi » 02.04.2007 16:22:15

slesa hat geschrieben:Ist da irgendwas falsch dran? - Offensichtlich, sonst ginge es ja...

Code: Alles auswählen

        var=$(ncdbin $1)
        if [ "$?" -ne 0 ]; then
                echo "Cancelled"
                exit 1;
        fi
        echo $var
        cd $var
Das letzte cd geht irgendwie nicht...

Dafür funktioniert dein function-Einzeilerer vorzüglich... aber was bedeutet $@?
Probier's im Zweifelsfall mit Anführungszeichen um die Variablennamen, also so:

Code: Alles auswählen

        var=$(ncdbin $1)
        if [ "$?" -ne "0" ]; then
                echo "Cancelled"
                exit 1;
        fi
        echo "$var"
        cd "$var"
kann dir jetzt aber auch nicht 100% versichern, dass das dein Problem löst.

gruß,
npi
"Bis zur Unendlichkeit, und noch viel weiter!"
--Buzz, Toystory

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Geht nicht...

Beitrag von gms » 02.04.2007 16:37:58

slesa hat geschrieben:aber was bedeutet $@?
$@ wird von der Shell durch die Liste der Argumente ersetzt, damit das Quoting aber auch korrekt weitergegeben wird, kann ${@+"$@"} verwendet werden:

Code: Alles auswählen

root@gms4:~# cat x.sh
worker() {
  N=0
  while [ $# -gt 0 ]; do
    N=$((N+1))
    echo "    arg$N=$1"
    shift
  done
}

caller1() {
  echo 'call worker using $@:'
  worker $@
}

caller2() {
  echo 'call worker using ${@+"$@"}:'
  worker ${@+"$@"}
}

caller1 "a b" "c"
caller2 "a b" "c"

root@gms4:~# ./x.sh
call worker using $@:
    arg1=a
    arg2=b
    arg3=c
call worker using ${@+"$@"}:
    arg1=a b
    arg2=c
root@gms4:~#
slesa hat geschrieben: Das letzte cd geht irgendwie nicht...
hier geht es auch nicht:

Code: Alles auswählen

root@gms4:~# cat y.sh
var=$(echo $1)
echo $var
cd $var
root@gms4:~# ./y.sh /home
/home
root@gms4:~# 
Ist das gleiche Problem, welches du ursprünglich hattest, "y.sh" wird in eine Subshell ( einem Unterprozeß ) gestartet

Das ist auch der Grund warum ich eine Funktion geschrieben haben, funkt aber auch mit einem Alias:

Code: Alles auswählen

root@gms4:~# alias ncd='cd $(echo ${@+"$@"})'
root@gms4:~# ncd /home
root@gms4:/home#
Gruß
gms

slesa
Beiträge: 45
Registriert: 11.02.2007 15:29:38

Gelöst

Beitrag von slesa » 02.04.2007 17:26:47

Man sollte das $@ auf http://en.wikibooks.org/wiki/Bourne_She ... ring_Tests ergänzen...
wie man sowas wichtiges nicht hinschreiben kann. Vielleicht wars zu offensichtlich...

Ach ja, man sollte in Funktionen auch vermeiden, exit 0 aufzurufen :-)

Hab jetzt folgende Lösung in die .bashrc eingebaut:

Code: Alles auswählen

function ncd() {
        case "$1" in
        help|read|group)
                ncdbin ${@+"$@"}
                ;;
        *)
                var=`ncdbin ${@+"$@"}`
                if [ "$?" -ne 0 ]; then
                        echo "Cancelled"
                else
                        cd $var
                fi
                echo $var
        esac
}
ncdbin muss natürlich im Pfad liegen. Cool. Dankeschön!

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 27.05.2007 16:48:28

gms hat geschrieben:
trigger hat geschrieben: Hab das (zugegebenermaßen kleine) Tool mal in ein Paket gepackt und werde zusehen, dass es bald in Debian landet.
super, auch kleine Dinge können Freude machen :)
Von was hängt die Verfügbarkeit in Debian dann eigentlich noch ab ? Muß der Upload nach Unstable oder Experimental noch warten bis Etch draußen ist, oder muß das noch irgendwie genehmigt werden ?
Nur falls es jemanden interessieren sollte: Apparix wartet jetzt in NEW darauf Unstable zu entern :)

EDIT: So, ist schon durch NEW, in 3 Studen nach dem nächsten dinstall-Lauf ist es zu haben :)
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 30.05.2007 20:37:58

Ich möchte in diesem Zusammenhang einfach mal auf die CDPATH-Variable hinweisen:

Code: Alles auswählen

~$ ls /tmp
foo bar
~$ ls /tmp/foo
baz
~$ echo $CDPATH
.:/tmp:/tmp/foo
~$ cd foo
/tmp/foo
/tmp/foo$ cd bar
/tmp/bar
/tmp/bar$ cd baz
/tmp/foo/baz
/tmp/foo/baz$

Antworten