Angenommen, ich habe 2 Verzeichnisse:
abc123
und
abc321
ich tippe ein:
abc3
und drücke enter.
Normalerweise muss man ja TAB drücken, damit der Verzeichnisname komplettiert wird (gibts das Wort?)
ich möchte aber das in diesem Falle des 1. Scheiterns ein weiters cd passiert, automatisch,
und zwar mit genau dem Ersatz, den auch das TABbing verursacht hätte (also abc321)
Mit anderen Worten, ich möchte - nur für cd - eine ander faules TAB completion implementieren.
Ist so etwas überhaupt möglich?
So weit reichen meine shell script Kenntnisse nicht. Evtl gibts so etwas in einer anderen Programmiersprache?
Scripting: In dir cd-en sofern ähnlicher Name vorhanden
- deadeye
- Beiträge: 561
- Registriert: 14.04.2004 15:32:18
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Ukio, rechts hinterm Feld
-
Kontaktdaten:
Also für eine Lösung in der Shell fällt mir spontan keine Lösung ein(wobei es da auch was geben muss).
Aber Du hast ja noch nach anderen Programmiersprachen gefragt, und da sag ich DIr jetzt C. Dort gibt es glob(). Aus der Manpage:
Gruß
deadeye
Aber Du hast ja noch nach anderen Programmiersprachen gefragt, und da sag ich DIr jetzt C. Dort gibt es glob(). Aus der Manpage:
Alternativ gibt es zum. unter Linux, noch fnmatch().Die Funktion glob() sucht alle Dateien, die dem Muster pattern, gemäß den Regeln der Shell, genügen und gibt sie zurück.
Vielleicht hilft es Dir ja.The fnmatch() function checks whether the string argument matches the pattern argument, which is a shell wildcard pattern.
Gruß
deadeye
Die einfachste Lösung ist eine bash-Funktion. (natürlich mußt du dann auch die bash verwenden ) Die Funktion trägst du in die ".bashrc" in deinem Homeverzeichnis oder /etc/bash.bashrc ein.
Sie könnte so aussehen:
Die hier sucht sich den ersten Ordner im aktuellen Verzeichnis auf den die Eingabe irgendwie passt und wechselt dort hinein.
der Aufruf wäre wie folgt:
Sie könnte so aussehen:
Code: Alles auswählen
function cdf()
{
x=0
oIFS="$IFS"
IFS="
"
for i in `ls | grep -e "^$1"`; do
if [ $x == 0 ]; then
if [ -d $i ]; then
x=x+1
cd $i
fi
fi
done;
IFS="$oIFS"
}
der Aufruf wäre wie folgt:
So würdest du z.B im Basisverzeichnis direckt in "/home" springen (sofern es kein Verzeichnis wie "/hoehe" existiert )/$ cdf ho
- deadeye
- Beiträge: 561
- Registriert: 14.04.2004 15:32:18
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Ukio, rechts hinterm Feld
-
Kontaktdaten:
DeinToPeG hat geschrieben:Code: Alles auswählen
function cdf() { [...] for i in `ls | grep -e "^$1"`; do [...] }
Code: Alles auswählen
ls | grep -e "^$1"
Aber so richtig bash is das ja auch nich, weil grep ist ein eigenes Tool (bei ls bin ich mir grade nich sicher, könnte aber auch ein Builti-I sein).
Also kommt man nich direkt an die Funktion ran, um das Drücken von TAB praktisch zu simulieren?
Gruß
deadeye
Nicht umbedingt es können ja mehrere Verzeichnisse da sein auf die die Buschataben passen, dann muß er "[Tab][Tab]", drücken, schauen usw. Zudem liegen c-d-f sehr dicht beieinander und sie lassen dich schnell hintereinander drücken.C_A hat geschrieben:Jetzt hat er aber den einen Tastengewinn (vom nicht drücken müssen der Tab) durch das "f" wieder verloren, also besser noch einen Alias draus machen
Außerdem wäre es ganz schlecht "cd" selbst zu verstecken, denn meine Funktion hat nicht den Funktionsumfang.
Sich nur bash ist das nicht. Die Bash ist nicht mein Steckenpferd. Ich wußte es nur zufällig, da ich mal ein anderes Problem hatte (Emulation der DOS-"Shell" für einen armen Professor der es nicht mehr lernen konnte ) Ich kenne mich mehr mit Perl ausdeadeye hat geschrieben:war wohl was ich meinte, als ich sagte es muss auch etwas in der bash geben.Code: Alles auswählen
ls | grep -e "^$1"
Aber so richtig bash is das ja auch nich, weil grep ist ein eigenes Tool (bei ls bin ich mir grade nich sicher, könnte aber auch ein Builti-I sein).
Möglichweise, da habe ich kein Ahnung. Aber mir geht es im Kopf herum, daß man in der Bash auch Aktionen auf Tastendruck auslösen kann.deadeye hat geschrieben: Also kommt man nich direkt an die Funktion ran, um das Drücken von TAB praktisch zu simulieren?
Nachtrag:
Die Zeile
Code: Alles auswählen
for i in `ls | grep -e "^$1"`; do
Code: Alles auswählen
for i in $1*; do