Erstellen Sie eine weitere Verknüpfung `~~` wie `~` (Home-Verzeichnis)

10

Ich möchte ~~auf ein anderes Verzeichnis verweisen, damit ich es als Verknüpfung verwenden kann. Ich möchte, dass es genau die gleichen Funktionen hat wie ~. Wie kann ich das machen?

VarunAgw
quelle
2
Sie könnten mit zsh benannten Verzeichnissen
Michael Mrozek
Nur fand eine interessante Lösung für das Problem superuser.com/a/565825/398328
VarunAgw
1
@ VarunAgw haha, lustiger Fund, genau wie ich an die gleiche Lösung gedacht hatte. Schande. Ich dachte, ich wäre für eine Minute ein einzigartiger Schmetterling :(
Soße

Antworten:

14

Eigentlich gibt es einen Weg, es ist kein guter Weg, aber es ist ein Weg, haha!

Fügen Sie Ihrer /etc/passwdDatei Folgendes hinzu :

~:x:1111:99:special Character user:/test:/sbin/nologin

Ersetzen Sie die 1111als UID durch etwas /testSinnvolles. Ersetzen Sie sie durch das Verzeichnis, das ~~ nachahmen soll.

99Auf meinem System befindet sich die nobodyGruppe, die ich empfehle, wenn Sie dies tun, um sicherzustellen, dass es sich um eine Gruppe ohne Berechtigungen für Dateien handelt, die jemals verwendet werden. Theoretisch sollte es /sbin/nologinals Shell nicht verwendet werden können, es wird auch keinen /etc/shadowEintrag haben, so dass es kein Passwort hat. Theoretisch sollte das in Ordnung sein, aber stellen Sie sicher, dass Sie sich dadurch nicht als Konto anmelden können.

Als Randnotiz: Ich sage in keiner Weise, dass dies eine gute Idee ist, aber es wird die Funktionalität erreichen, die Sie wollen.

EDIT: Die Vollständigkeit halber wurde diese von VarunAgw vorgeschlagen: Sie könnten die Benutzer wie gewohnt hinzufügen mit useradd -s /sbin/nologin -N tmpund ändern /etc/passwdund /etc/shadowden Benutzer ändern tmpzu ~und die Position der ändernhome directory

Soße
quelle
Anstelle von UID und GID ändern, können wir einfach useradd 'tmp'und ersetzen Sie dann tmpmit~
VarunAgw
Wahr. guter Vorschlag. Ich bin mir nicht sicher, wie ich es mit einem shadowEintrag legitimieren soll, aber ich nehme an, solange kein Passwort festgelegt ist, ist dies kein zusätzliches Risiko.
Soße
8

Sie können CDPATH verwenden und ein Verzeichnis mit einem wörtlichen Namen ~~ in eine Ihrer CDPATH-Komponenten einfügen.

Von man bash(aber CDPATH ist auch in verfügbar sh)

Der Suchpfad für den Befehl cd. Dies ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen die Shell nach Zielverzeichnissen sucht, die vom Befehl cd angegeben werden. Ein Beispielwert ist ".: ~: / Usr".

Das wird es Ihnen ermöglichen cd ~~.

Wenn Sie Dinge wie vi ~~/someFilevon einer beliebigen Stelle im Verzeichnisbaum aus ausführen möchten, haben Sie kein Glück, wenn Sie ~~buchstäblich darauf bestehen, es sei denn, Sie hacken Ihre Shell. Sie können jedoch Variablen oder Umgebungsvariablen verwenden, um Ihre magischen Verzeichnisse zu speichern, damit Sie dies tun können , z.B,$tilda/someFile

Normalerweise lege ich Dateien, auf die häufig zugegriffen wird, in kurz benannten Verzeichnissen in meinem Ausgangsverzeichnis ab, damit ich mit Pfaden wie ~/boder darauf zugreifen kann ~/l.

Natürlich können Sie Verzeichnisse normalerweise beliebig oft durch Symlinks zu Verzeichnissen ersetzen.

PSkocik
quelle
1

Die ~Tilde-Erweiterung der Shell ist größtenteils programmierbar. Es wird entweder auf das Benutzerverzeichnis des Systembenutzernamens erweitert, das in seinem nachfolgenden Kontext deklariert wurde (und eine hervorragende Lösung in dieser Richtung wurde bereits angeboten) , auf den Wert der $HOMEShell-Variablen oder überhaupt nicht.

So:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

Ich ändere $HOMEständig und behalte eine Funktion in der Umgebungsdatei meiner Shell, um sie zurückzusetzen:

home(){
    HOME=~$USER
    cd ~; pwd
}

Wenn Sie die ~Tilde auf eine Weise verwenden möchten , die nicht auf Ihr Home-Verzeichnis verweist, tun Sie dies . Einfach neu zuweisen $HOME. Hab keine Angst davor. $HOMEist nur eine Shell-Variable wie jede andere.


Ein weiterer Vorschlag, den ich habe, ist nur eine geringfügige Erweiterung der hervorragenden Ratschläge von @ PSkocik zur Verwendung $CDPATH. Eine Sache, die er jedoch nicht erwähnt hat, ist, dass Sie $CDPATHInline verwenden und ändern können, ohne den aktuellen Shell-Wert für $CDPATHüberhaupt zu ändern . Beispielsweise:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdist notwendigerweise eine eingebaute Shell, aber es ist keine eingebaute POSIX- Spezial- Shell. Die Angabe des Werts für $CDPATHhat daher keinen Einfluss auf den aktuellen Shell-Wert. Wenn Sie es wie oben beschrieben verwenden $CDPATH, wird der Wert nur für die Umgebung des einen cdBefehls geändert und anschließend auf den vorherigen Wert zurückgesetzt. Ich finde die obige Technik am nützlichsten, wenn sie in Kombination mit der Vervollständigung der Historie verwendet wird. Ich mache das Obige, wechsle in ein Verzeichnis, führe ein paar Befehle aus und drücke dann nach oben, bis ich zu meinem cdBefehl zurückkehre und ein oder zwei Pfadsegmente zurücksetze, um an eine andere Stelle zu wechseln.


Wenn Sie diese beiden Konzepte kombinieren, können Sie festlegen, dass ein zuvor verwendeter Befehl bei der nächsten Verwendung etwas völlig anderes bedeutet.

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2
mikeserv
quelle
0

Funktioniert perfekt als Bash-Funktion:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

Hier ist ein weiterer Ansatz, der etwas näher kommt (ich weiß, dass ich den Anforderungen nicht so nahe komme).

function ~~ { echo /test; }

Dann mit ein paar weiteren Zeichen:

cd `~~`/subdir
vi `~~`/file
Glenn Jackman
quelle
2
Nun, cd ~~/foo/barwird nicht so gut funktionieren, oder vim ~~/foo.txt, etc ...
derobert
1
Die Frage ist unklar. Wenn dies die gewünschte Verwendung ist, würde ich die CDPATHVariable verwenden, um den cdFall zu behandeln .
Glenn Jackman
Ich bin damit einverstanden, dass es nicht ganz klar ist, aber OP verlangt, dass es so funktioniert ~. Und ~wird nicht wie ein Befehl verwendet.
Derobert
Ich fand es selbst ziemlich verständlich, wenn auch nicht vollständig formuliert. Das Problem mit CDPATHist, dass es nicht für Befehle außerhalb von .... CD funktioniert. IE Sie konnten cd ~~oder cd ~~/testdir1aber Sie konnten nichtvim ~~testdir1
Soße
Sie können es besser mit einem Alias ​​machen, der eine Funktion aufruft. likealias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv