• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]Pfadalias in der bash

Gibt es eigentlich in der bash eine Möglichkeit sowas wie ein Pfadalias zu definieren?

Ich würde gerne ~~ in der Shell regelmäßig in /home/Benutzer/Documents übersetzen. Mit einem Softlink geht das nicht, da dann ja entweder ~/~~ geschrieben werden müsste oder das ganze nur für einen bestimmten Benutzer funktioniert, wenn der link ~~ im /-Verzeichnis steht. Es soll aber für jeden Benutzer funktionieren...
 
Füge doch einfach in der /etc/profile.local eine Variable die den Pfad zu dem Verzeichnis speichert und exportiert.

Code:
export USER_DOC=$HOME/Documents
 
spoensche schrieb:
Füge doch einfach in der /etc/profile.local eine Variable die den Pfad zu dem Verzeichnis speichert und exportiert.

Code:
export USER_DOC=$HOME/Documents

Dann muss ich aber cd $USER_DOC, ls $USER_DOC, bzw. cd $~~ usw. schreiben. Die Frage ist aber, ob es auch irgendwie ohne das Dollarzeichen geht...
 
Wie wäre es mit einer Alias-Eintragung in der /etc/bash.bashrc.local?
Code:
if test "$is" != "ash" ; then
  alias ~~='cd ~/Documents'
fi
Wenn Du nur den Verzeichnisnamen willst, dann geht es nicht ohne das dafür vorgesehene $-Zeichen.

Wozu soll das Ganze dienen? Vielleicht ist Dein Weg doch nicht der richtige?
 
josef-wien schrieb:
Wozu soll das Ganze dienen? Vielleicht ist Dein Weg doch nicht der richtige?

Ich möchte weil ich tippfaul bin ein möglichst kurzes und leicht erreichbares Alias für diesen Pfad haben, so dass ich nicht nur leicht dorthin wechseln kann, sondern auch alle möglichen Copy-, List- usw.-Kommandos so ausführen kann, also

cd ~~
ls ~~
mv ~~/blurp ~~/blurp.old

usw.

Ich werde also wahrscheinlich nicht um das Dollarzeichen herumkommen, das leider einen größeren Fingerspagat als ~ erfordert (SHIFT+4 statt ALTGr++) ...
 
Hallo,

eine Möglichkeit wäre dieser Weg:

01. Ein bash-Script schreiben
Code:
#!/bin/bash
# Dateiname: ls_-la1_home_user_dokumente.sh
# Funktion: Das Verzeichnis ~/Dokumente anzeigen lassen
# 
ls -la1 ~/Dokumente
02. Dieses Script ausführbar machen
Code:
chmod +x ls_-la1_home_user_dokumente.sh
03. Einen symbolischen Link nach /home/DEIN-NAME/bin legen
Code:
cd /home/DEIN-NAME/bin
ln -s ~/ls_-la1_home_user_dokumente.sh dokumente

Danach brauchst du, egal in welchem Verzeichnis du dich befindest, nur noch das Wort dokumente gefolgt von Return einzugeben und bekommst den Inhalt des besagten Verzeichnisses angezeigt.
Oder ist es für dich zwingend notwendig das du auch gleich in diesem Ordner bist?

Eleganter geht es aber mit dem Anlegen von Alias-Namen:
Code:
alias dokumente='ls -la1 ~/Dokumente'
dokumente -> zeigt dir den Inhalt von Dokumente an, egal wo du bist

Code:
alias Dokumente='cd ~/Dokumente'
Dokumente -> wechselt in /Dokumente/ des aktuellen User
lieben Gruß aus Hessen
 
Herz-von-Hessen schrieb:
Oder ist es für dich zwingend notwendig das du auch gleich in diesem Ordner bist?
Mir kommt es eigentlich eher darauf an, dass ich ~~ in allen möglichen Kommandos (also cp, mv, rm, ln, ...) als Pfad verwenden kann, vor allem um die dort befindlichen Unterverzeichnisse bequem anzusprechen. ls und cd brauche ich eigentlich weniger.

lieben Gruß aus Hessen
Zurück, da wohne ich auch ;)
 
Guten Morgen,
harvey schrieb:
ls und cd brauche ich eigentlich weniger.
Dann musst Du halt für jede Aktion einen entsprechenden Alias setzen.
alias cptodokument='cp $VERZEICHNIS/*.* ~/Dokumente'
Die Variable $VERZEICHNIS muss natürlich angelegt sein, welche Variablen gesetzt sind erfährst du mit
Code:
set
näheres wirst du mit Google bestimmt auch erfahren, ich bin nicht so fit darin.
harvey schrieb:
da wohne ich auch ;)
Schöne Ecke hier :)
 
Herz-von-Hessen schrieb:
Dann musst Du halt für jede Aktion einen entsprechenden Alias setzen.
Dann kann ich es eigentlich auch gleich ausschreiben. Offenbar geht es wirklich nicht. ausser durch Variablen mit Dollarzeichen davor. Ich könnte höchstens noch einen symbolischen link "ln -s ~/Dokumente ~/~" setzen. Dann hätte ich ~/~ als Abkürzung statt ~~.
 
Doch, es ginge: Wenn Du die Quellen von bash herunterlädtst, Deine "~~"-Expandierung dort in C implementierst, alles kompilierst und Deine bestehende bash durch die gehackte ersetzt.

Ziemlicher Aufwand, wenn Du mich fragst, aber nicht unmöglich.
 
abgdf schrieb:
Doch, es ginge: Wenn Du die Quellen von bash herunterlädtst, Deine "~~"-Expandierung dort in C implementierst, alles kompilierst und Deine bestehende bash durch die gehackte ersetzt.

Ziemlicher Aufwand, wenn Du mich fragst, aber nicht unmöglich.
Hmm, die Implementierung wäre vermutlich nicht so furchtbar aufwendig. Aufwendig ist wohl am ehesten die entsprechende Stelle in den Quellen zu finden. Kennst Du Dich ein wenig mit den bash-Quellen aus und kannst mir sagen, wo z.B. die ~-Variable für für das home-Verzeichnis definiert wird?
 
Du hast es so gewollt!
bash 3.0 (SuSE 10.0 (meine Distro) src-rpm):

In "general.c" (grep ist bei der Suche hilfreich, z.B. "grep -i tilde *" im Source-Verzeichnis): Also, statt:
Code:
static char *
bash_special_tilde_expansions (text)
     char *text;
{
  char *result;

  result = (char *)NULL; 

  if (text[0] == '+' && text[1] == '\0')
    result = get_string_value ("PWD");
  else if (text[0] == '-' && text[1] == '\0')
    result = get_string_value ("OLDPWD");
#if defined (PUSHD_AND_POPD)
  else if (DIGIT (*text) || ((*text == '+' || *text == '-') && DIGIT (text[1])))    result = get_dirstack_from_string (text);
#endif

  return (result ? savestring (result) : (char *)NULL);
}
folgendes (also zwei Zeilen zusätzlich):
Code:
static char *
bash_special_tilde_expansions (text)
     char *text;
{
  char *result;

  result = (char *)NULL; 

  if (text[0] == '+' && text[1] == '\0')
    result = get_string_value ("PWD");
  else if (text[0] == '~' && text[1] == '\0')
    result = "/home/user/yourdirectory";
  else if (text[0] == '-' && text[1] == '\0')
    result = get_string_value ("OLDPWD");
#if defined (PUSHD_AND_POPD)
  else if (DIGIT (*text) || ((*text == '+' || *text == '-') && DIGIT (text[1])))    result = get_dirstack_from_string (text);
#endif

  return (result ? savestring (result) : (char *)NULL);
}
Dann muß man noch die Patches einpflegen (vielleicht das auch zuerst); hab' ich noch nie gemacht. Soll mit Larry Wall's "patch" gehen ("man patch").

Also, bei mir geht's (erstmal ohne Patches).

HTH
 
Um die bash noch etwas bequemer zu machen, gibt es auch die sog. "bash_completion":

http://www.debian-administration.org/article/An_introduction_to_bash_completion_part_1
http://www.pro-linux.de/NB3/artikel/2/153/1,programmierbare-eingabe-vervollstaendigung-in-bash.html

Macht (glaube ich) zwar nicht genau das, was Du willst, aber kann allemal eine praktische Hilfe sein.

Gruß
 
abgdf schrieb:
Ja, darauf würde ich mich sogar sehr gerne einlassen. Ich kann mir dann ja eine "mybash" kompilieren und diese ausschließlich als login-shell verwenden.

inzwischen erledigt:(Wo bekomme ich denn die für meine distri passende src her? (SuSE 11.2., Bash-Version 4.0.35(1)-release (i586-suse-linux-gnu), rpm: bash-4.0-18.4.1.i586.rpm) Habe schon mal unter downloads.opensuse gesucht, bin da aber nicht so recht fündig geworden.)


Code:
  else if (text[0] == '~' && text[1] == '\0')
    result = "/home/user/yourdirectory";
Hier muss ich dann natürlich die entsprechende Funktion einfügen, die mir das jeweilige Heimatverzeichnis des aufrufenden Users + suffix einbaut, eben wie ~. Sollte aber zu finden sein, wenn ich mir die sourcen erst mal anschaue. Mit den patches müsste ich eigentlich auch klarkommen.

Danke auch für den Tipp mit bash-completion. Werde ich mir auch anschauen.

Nachtrag:
Hab's inzischen mit folgendem Code hingekriegt:
Code:
#include <string.h>
...
if (text[0] == '+' && text[1] == '\0')
      result = get_string_value ("PWD");
    else if (text[0] == '~' && text[1] == '\0')
      {
        result = get_string_value ("HOME");
        strcat(result,"/Dokumente");
      }
    else if (text[0] == '-' && text[1] == '\0')
      result = get_string_value ("OLDPWD");
Fehlt jetzt ebenfalls nur noch das patchen.
 
Hallo abgdf,
abgdf schrieb:
Doch, es ginge: Wenn Du die Quellen von bash herunterlädtst, Deine "~~"-Expandierung dort in C implementierst, alles kompilierst und Deine bestehende bash durch die gehackte ersetzt
Uff, ja das wäre mir dann auch zu viel Arbeit, vor allem weil man dann bei jedem Update wohl auch neu compilieren muss.
Nichts ist unmöglich..... :D
lieben Gruß aus Hessen
 
Herz-von-Hessen schrieb:
Hallo abgdf,
abgdf schrieb:
Doch, es ginge: Wenn Du die Quellen von bash herunterlädtst, Deine "~~"-Expandierung dort in C implementierst, alles kompilierst und Deine bestehende bash durch die gehackte ersetzt
Uff, ja das wäre mir dann auch zu viel Arbeit, vor allem weil man dann bei jedem Update wohl auch neu compilieren muss.
Naja, die Systembash für Skripte usw. bleibt ja unangetastet und wird beim Update regelmäßig aktualisiert. Ich mache mir halt einmal (oder je nach Laune immer mal wieder) eine eigene bash mit eigenem Namen unter /usr/local/bin, die ich dann als reine login-Shell an die accounts vergebe, die das feature brauchen. Wenn ich aus irgendeinem Grund dann doch mal eine aktuelle Original-bash brauche, dann gebe ich am shell-Prompt einfach bash ein.

Noch ein zu berücksichtigendes Problem ist mir aufgefallen. Welche --Optionen sollte ich denn bei configure sinnvollerweise mitübergeben, bzw. wie bekomme ich denn heraus, mit welchen Optionen die SuSE-bash übersetzt wurde?
 
Hallo,
harvey schrieb:
Naja, die Systembash für Skripte usw. bleibt ja unangetastet und wird beim Update regelmäßig aktualisiert.
Na dann :)
Ob sich der Aufwand lohnt hängt halt davon ab wie viele Clients dieses Feature benötigen.
Viel Erfolg damit wünsche ich dir auf alle Fälle.
lieben Gruß aus Hessen
 
Herz-von-Hessen schrieb:
Ob sich der Aufwand lohnt
Ich höre immer Aufwand? Wenn mir das Einfügen der drei Zeilen von Hand mal zu bunt wird, dann mache ich mir halt selber einen patch dazu, der wohl auch funktionsfähig bleibt, solange sich die bash-Quellen nicht gravierend ändern. Das Kompilieren selbst (configure, make) und das Kopieren nach /usr/local ist ja wohl weniger Aufwand als ein entsprechender yast-Durchlauf.
 
Oben