Verzeichnis wird restauriert?
Verzeichnis wird restauriert?
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.
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.
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:
edit: wahrscheinlich hat sich meine Hoffnung nicht erfüllt , in der Zwischenzeit hast du ein ähnliches Beispiel angefügt
Gruß
gms
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:~#
Gruß
gms
Ich geb aber gerne zu, daß deins hübscher istgms hat geschrieben: edit: wahrscheinlich hat sich meine Hoffnung nicht erfüllt , in der Zwischenzeit hast du ein ähnliches Beispiel angefügt
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 (?)
vielleicht gefällt dir diese Lösung:
Gruß
gms
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#
gms
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.gms hat geschrieben:vielleicht gefällt dir diese Lösung:
Wär schade, wenn ich zusätzlich noch ein Skript basteln müßte...
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:
Vielleicht gefällt es dir ja auch, oder vielleicht schreibst du ein OpenSource Programm und stellst es hier einmal vor
Gruß
gms
Im letzten Linux-Magazin wurde dieses Tool vorgestellt:
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.http://micans.org/apparix/ hat geschrieben: Apparix allows fast file system navigation by bookmarking directories and jumping to a bookmark directly.
Vielleicht gefällt es dir ja auch, oder vielleicht schreibst du ein OpenSource Programm und stellst es hier einmal vor
Gruß
gms
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: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.
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.gms hat geschrieben: Apparix allows fast file system navigation by bookmarking directories and jumping to a bookmark directly.
Deshalb:
ncd group v1.2; ncd mylib
und fertig.
gms hat geschrieben: vielleicht schreibst du ein OpenSource Programm und stellst es hier einmal vor
/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
@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:
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
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
}
@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
--Buzz, Toystory
Hab das (zugegebenermaßen kleine) Tool mal in ein Paket gepackt und werde zusehen, dass es bald in Debian landet.gms hat geschrieben:Im letzten Linux-Magazin wurde dieses Tool vorgestellt: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.http://micans.org/apparix/ hat geschrieben: Apparix allows fast file system navigation by bookmarking directories and jumping to a bookmark directly.
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
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams
super, auch kleine Dinge können Freude machentrigger hat geschrieben: Hab das (zugegebenermaßen kleine) Tool mal in ein Paket gepackt und werde zusehen, dass es bald in Debian landet.
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
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).
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
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams
Allein das "Bookmark" scheint schon nicht das zu sein, was ich will. Ich mals mal kurz an. Gegeben sei eine Verzeichnisstruktur wie folgt:Trigger. hat geschrieben: Hier mal ein Schnipsel aus der Manpage, ist das das was du willst?
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
Mein Ziel wärs jetzt mittels
Code: Alles auswählen
ncd group edina
ncd lolevel
Befindet sich eigentlich ein QT-Entwickler unter uns? Der mir vielleicht bei der "Vermarktung" der Tools helfen möchte?
Hilfe beim Scripten
Also irgendwie bekomm ich das Skript nicht so hin. Mir fehlt die Fehlerüberprüfung, falls der Pfad nicht existiert.
Mit fehlt sowas wie $var = 'ncd $1'. Weiß jemand Abhilfe?
Code: Alles auswählen
#!/bin/sh
case "$1" in
help|read|group)
ncd.exe $1 $2 $3
;;
*)
cd 'ncd.exe $1'
;;
esac
Re: Hilfe beim Scripten
suche dir eins aus:slesa hat geschrieben: Mit fehlt sowas wie $var = 'ncd $1'. Weiß jemand Abhilfe?
Code: Alles auswählen
var=`ncd $1`
var=$(ncd $1)
gms
Geht nicht...
Ist da irgendwas falsch dran? - Offensichtlich, sonst ginge es ja...
Das letzte cd geht irgendwie nicht...
Dafür funktioniert dein function-Einzeilerer vorzüglich... aber was bedeutet $@?
Code: Alles auswählen
var=$(ncdbin $1)
if [ "$?" -ne 0 ]; then
echo "Cancelled"
exit 1;
fi
echo $var
cd $var
Dafür funktioniert dein function-Einzeilerer vorzüglich... aber was bedeutet $@?
Re: Geht nicht...
Probier's im Zweifelsfall mit Anführungszeichen um die Variablennamen, also so:slesa hat geschrieben:Ist da irgendwas falsch dran? - Offensichtlich, sonst ginge es ja...Das letzte cd geht irgendwie nicht...Code: Alles auswählen
var=$(ncdbin $1) if [ "$?" -ne 0 ]; then echo "Cancelled" exit 1; fi echo $var cd $var
Dafür funktioniert dein function-Einzeilerer vorzüglich... aber was bedeutet $@?
Code: Alles auswählen
var=$(ncdbin $1)
if [ "$?" -ne "0" ]; then
echo "Cancelled"
exit 1;
fi
echo "$var"
cd "$var"
gruß,
npi
"Bis zur Unendlichkeit, und noch viel weiter!"
--Buzz, Toystory
--Buzz, Toystory
Re: Geht nicht...
$@ wird von der Shell durch die Liste der Argumente ersetzt, damit das Quoting aber auch korrekt weitergegeben wird, kann ${@+"$@"} verwendet werden:slesa hat geschrieben:aber was bedeutet $@?
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:~#
hier geht es auch nicht:slesa hat geschrieben: Das letzte cd geht irgendwie 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:~#
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#
gms
Gelöst
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:
ncdbin muss natürlich im Pfad liegen. Cool. Dankeschön!
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
}
Nur falls es jemanden interessieren sollte: Apparix wartet jetzt in NEW darauf Unstable zu enterngms hat geschrieben:super, auch kleine Dinge können Freude machentrigger hat geschrieben: Hab das (zugegebenermaßen kleine) Tool mal in ein Paket gepackt und werde zusehen, dass es bald in Debian landet.
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 ?
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
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams
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$