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?
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?
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 :
~:x:1111:99:special Character user:/test:/sbin/nologin
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 die nobody
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 ändern tmp
zu ~
und die Position der ändernhome directory
useradd 'tmp'
und ersetzen Sie dann tmp
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ü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 ~~/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.
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:
(HOME=/tmp; cd ~)
pwd; echo "$HOME"
/tmp
/home/mikeserv
Ich ändere $HOME
stä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. $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:
mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2
/tmp/1/2
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 einen cd
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 meinem cd
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.
for HOME in /tmp ~
do mkdir -p ~/1/2
CDPATH=~ cd 1/2
done
/tmp/1/2
/home/mikeserv/1/2
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
cd ~~/foo/bar
wird nicht so gut funktionieren, oder vim ~~/foo.txt
, etc ...
CDPATH
Variable verwenden, um den cd
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 konnten cd ~~
oder cd ~~/testdir1
aber Sie konnten nichtvim ~~testdir1
alias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '