Wie zeige ich den aktuellen Pfad in der Eingabeaufforderung in Linux's sh (nicht bash) an?

43

Ich möchte den aktuellen Pfad in der sh-Eingabeaufforderung anzeigen (nicht in der bash-Shell), in der derzeit nur "#" angezeigt wird. Ich habe versucht, dies einzuführen

env PS1="$(whoami)@$(hostname):$(pwd)"

und

set PS1="$(whoami)@$(hostname):$(pwd)"

in /etc/profile.

Dies wird jedoch nicht aktualisiert, wenn das Verzeichnis geändert oder der Benutzer geändert wird. Bitte schlagen Sie einen Weg vor, um diese Dynamik zu erreichen.

Bleamer
quelle
1
Beachten Sie, dass jeder $()ein separates Programm ausführt. es wäre schneller Umgebungsvariablen zu verwenden, wie zum Beispiel $LOGNAME, $HOSTNAMEund $PWDstattdessen.
Grawity
Eine Antwort bestand darin, einfache Anführungszeichen anstelle von doppelten Anführungszeichen zu verwenden. Dies ist jedoch die vollständig richtige Antwort. Was Sie wirklich tun möchten, ist die Verschiebung der Auswertung des Codes in Ihrer Eingabeaufforderung, bis die Eingabeaufforderung verwendet wird.
MaasSql
Sie müssen nur export "PS1 =" $ (whoami) @ $ (hostname): $ (pwd)> "verwenden, dann / etc / profile bearbeiten und diese Zeile am Ende anhängen.
SDsolar

Antworten:

76

Befehlsersetzungen in doppelten Anführungszeichen werden "sofort erweitert. Das ist nicht das, was Sie für Ihre Aufforderung wollen. Einfache Anführungszeichen 'behalten die Ersetzungen bei, $PS1die dann nur beim Anzeigen der Eingabeaufforderung erweitert werden. Daher sollte dies funktionieren:

export PS1='$(whoami)@$(hostname):$(pwd)'

Wenn Sie das übliche Dollarzeichen und ein Leerzeichen am Ende Ihrer Eingabeaufforderung wünschen, fügen Sie es einfach $am Ende hinzu (kein Escape- Zeichen erforderlich):export PS1='$(whoami)@$(hostname):$(pwd)$ '

mpy
quelle
1
Nachdem export PS1='$(whoami)@$(hostname):$(pwd)$'ich in deiner Antwort "Set" auf "Exportieren" geändert habe, hat es wie ein Zauber funktioniert. Ich habe die Änderungen in gespeichert /etc/profile. Vielen Dank.
Bleamer
@Bleamer: Hat setfür mich gearbeitet (aber ich hatte keinen Muttersprachler sh). Aber ich ändere es so export, dass es Ihrem Setup entspricht.
mpy
2
Gibt es eine Möglichkeit, dies dauerhaft zu machen? Momentan muss ich es jedes Mal tun, wenn ich mich anmelde. Danke!
the.ufon
3
Sie haben diese Zeile mit /etc/profile(siehe Frage) oder ~/.profile?!
mpy
+1, dies würde jedoch ein Trennzeichen am Ende erfordern. So wie es ist, bekommst du sowas foo@localhost:/home/fools -labei der Benutzung ls -la.
Phresnel
12
sh-4.2$ export PS1="\u@\h:\w>"
jenny@serenity:~>cd /usr/local
jenny@serenity:/usr/local>
Jenny D
quelle
1
Ich fürchte, das funktioniert für Bash-Shell nicht für SH, wenn ich das tue, bekomme ich \u@\h:\w>als meine Eingabeaufforderung
Bleamer
1
Muss eine andere sh-Version sein; Wie Sie an der ersten Zeile sehen können, hat es bei mir in sh 4.2 funktioniert.
Jenny D
1
Das mag der Fall sein. Diese Shell ist von Busy Box. Vielen Dank. Schätzen Sie Ihre Hilfe.
Bleamer
@Bleamer, es funktioniert bei mir mit BusyBox v1.19.4 built-in shell (ash).
cjm
Vielen Dank für die Antwort @cjm, obwohl ich es vermeiden werde, weiter darauf einzugehen.
Bleamer
5

Dieser Befehl funktioniert bei mir.

export PS1="\u@\h: \W:$"

Wobei
\ u = Benutzername
\ h = Hostname
\ W Name des aktuellen Ordners (nicht vollständiger Pfad)

Rangsiman
quelle
+1 für \ W-Parameter
Dimitry K
3

Man könnte überlegen, die Eingabeaufforderung durch Hinzufügen einiger Farben zu verbessern. Zum Beispiel:

export PS1='\[\e[0;36m\]\u\[\e[0m\]@\[\e[0;33m\]\h\[\e[0m\]:\[\e[0;35m\]\w\[\e[0m\]\$ '
Arvid
quelle
1
Das ist, wonach ich gesucht habe. Ich hoffe, jeder mag einige Farben im Leben :)
Govind Kailas
Zumindest tue ich das. ;)
Arvid
1

Eine Antwort bestand darin, einfache Anführungszeichen anstelle von doppelten Anführungszeichen zu verwenden, dies ist jedoch nicht ganz die richtige Antwort. Was Sie wirklich tun möchten, ist die Verschiebung der Auswertung des Codes in Ihrer Eingabeaufforderung, bis die Eingabeaufforderung verwendet wird.

set PS1="$(pwd)" 

Setzt die Eingabeaufforderung ab dem Befehl set auf das Arbeitsverzeichnis.

set PS1="\$(pwd)" 

Erweitert NICHT $ (pwd). Stattdessen wird PS1 auf den Literalwert von $ (pwd) gesetzt.

Testen / Verstehen Sie dies, indem Sie Folgendes ausführen:

echo $PS1

. Wenn Sie die Zeichenfolge $ pwd sehen, funktioniert Ihre Eingabeaufforderung. Wenn Sie den Literalpfad sehen, ist die Eingabeaufforderung unterbrochen, weil sie statisch festgelegt wurde

MaasSql
quelle
1

Verwenden Sie den folgenden Befehl, um wie in der Kontrollleiste festzulegen.

exportiere PS1='$(whoami)@${HOSTNAME%%.*} [$ (pwd)] # '

Mailand
quelle
Vielen Dank! Keine der anderen oben genannten Optionen hat funktioniert. Dieser hat es getan. Hat mich verrückt gemacht. Danke, dass du meine Gesundheit gerettet hast. HA!
Lee_Str