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 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
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.
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/2done
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 '
Antworten:
Eigentlich gibt es einen Weg, es ist kein guter Weg, aber es ist ein Weg, haha!
Fügen Sie Ihrer
/etc/passwd
Datei Folgendes hinzu :Ersetzen Sie die
1111
als UID durch etwas/test
Sinnvolles. Ersetzen Sie sie durch das Verzeichnis, das ~~ nachahmen soll.99
Auf meinem System befindet sich dienobody
Gruppe, 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/nologin
als Shell nicht verwendet werden können, es wird auch keinen/etc/shadow
Eintrag 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 tmp
und ändern/etc/passwd
und/etc/shadow
den Benutzer änderntmp
zu~
und die Position der ändernhome directory
quelle
useradd 'tmp'
und ersetzen Sie danntmp
mit~
shadow
Eintrag legitimieren soll, aber ich nehme an, solange kein Passwort festgelegt ist, ist dies kein zusätzliches Risiko.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ügbarsh
)Das wird es Ihnen ermöglichen
cd ~~
.Wenn Sie Dinge wie
vi ~~/someFile
von 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
~/b
oder darauf zugreifen kann~/l
.Natürlich können Sie Verzeichnisse normalerweise beliebig oft durch Symlinks zu Verzeichnissen ersetzen.
quelle
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$HOME
Shell-Variablen oder überhaupt nicht.So:
Ich ändere
$HOME
ständig und behalte eine Funktion in der Umgebungsdatei meiner Shell, um sie zurückzusetzen: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.$HOME
ist 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$CDPATH
Inline verwenden und ändern können, ohne den aktuellen Shell-Wert für$CDPATH
überhaupt zu ändern . Beispielsweise:cd
ist notwendigerweise eine eingebaute Shell, aber es ist keine eingebaute POSIX- Spezial- Shell. Die Angabe des Werts für$CDPATH
hat 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 einencd
Befehls 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 meinemcd
Befehl 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.
quelle
Funktioniert perfekt als Bash-Funktion:
Hier ist ein weiterer Ansatz, der etwas näher kommt (ich weiß, dass ich den Anforderungen nicht so nahe komme).
Dann mit ein paar weiteren Zeichen:
quelle
cd ~~/foo/bar
wird nicht so gut funktionieren, odervim ~~/foo.txt
, etc ...CDPATH
Variable verwenden, um dencd
Fall zu behandeln .~
. Und~
wird nicht wie ein Befehl verwendet.CDPATH
ist, dass es nicht für Befehle außerhalb von .... CD funktioniert. IE Sie konntencd ~~
odercd ~~/testdir1
aber Sie konnten nichtvim ~~testdir1
alias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '