Legen Sie den Titel des Terminalfensters auf das aktuelle Verzeichnis fest

38320
kareman

Wie kann ich die Terminal.app in OS X dazu bringen, das aktuelle Verzeichnis in seinem Fenster oder Tabtitel anzuzeigen?

Ich benutze die Bash-Shell.

68
Ich frage mich immer, warum nicht auch Leute, die die Frage beantworten, daran denken, sich dafür zu entscheiden. cregox vor 14 Jahren 0

7 Antworten auf die Frage

59
Darren Hall

Kommt auf deine Schale an.

Dieser Artikel zeigt mehrere Methoden.

Ich persönlich verwende zsh, das eine praktische precmd () - Funktion hat, die vor jeder Aufforderung ausgeführt wird.

 precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt 

Obwohl die anderen Fragen bash-Methoden auflisten, nennen sie Alias ​​cd. Bash bietet eine inhärente Methode, die nur die Eingabeaufforderung verkettet.

bash

bash liefert eine Variable PROMPT_COMMAND, die einen Befehl enthält, der vor der Aufforderung ausgeführt werden soll. Dieses Beispiel (in ~ / .bashrc eingefügt) setzt den Titel auf "Benutzername @ Hostname: Verzeichnis":

 PROMPT_COMMAND='echo -ne "\033]0;$@$: $\007"' 

Dabei ist \ 033 der Zeichencode für ESC und \ 007 für BEL. Beachten Sie, dass das Zitieren hier wichtig ist: Variablen werden in "..." erweitert und nicht in "...". PROMPT_COMMAND wird also auf einen nicht erweiterten Wert gesetzt, aber die Variablen in "..." werden erweitert, wenn PROMPT_COMMAND verwendet wird.

PWD erstellt jedoch den vollständigen Verzeichnispfad. Wenn Sie die Abkürzung '~' verwenden möchten, müssen Sie die Escape-Zeichenfolge in die Eingabeaufforderung einbetten, sodass wir die folgenden Eingabeaufforderungen der Shell nutzen können:

\u expands to $USERNAME \h expands to hostname up to first '.' \w expands to directory, replacing $HOME with '~' \[...\] embeds a sequence of non-printing characters 

Folgendes erzeugt also eine Eingabeaufforderung von "bash $" und einen Xterm-Titel von "Benutzername @ Hostname: Verzeichnis" ...

 case $TERM in xterm*) PS1="\[\033]0;\u@\h: \w\007\]bash\$ " ;; *) PS1="bash\$ " ;; esac 

Beachten Sie die Verwendung von [...], mit dem bash die nicht druckenden Steuerzeichen ignoriert, wenn Sie die Breite der Eingabeaufforderung berechnen. Ansonsten werden die Zeilenbearbeitungsbefehle beim Positionieren des Cursors verwirrt.

Sollte ich erwähnt haben, dass ich bash benutze, habe ich die Frage aktualisiert. kareman vor 14 Jahren 0
Die bash-Methode wurde aus dem aufgeführten Link hinzugefügt. Darren Hall vor 14 Jahren 0
Sehr gut. Um nur den Pfad zum aktuellen Verzeichnis im Titel und den Namen des aktuellen Verzeichnisses in der Eingabeaufforderung zu erhalten, habe ich gerade PS1 = "\\ [\ 033] 0; \ w \ 007 \\] \ W \ $" verwendet. kareman vor 14 Jahren 0
Für mich funktionierte das Beispiel (PROMPT_COMMAND = 'echo -ne "\ 033] 0; $ @ $ : $ \ 007' ') nur, wenn ** auf ~ / .profile ** gesetzt ist. cregox vor 14 Jahren 0
"Wenn wir die Abkürzung '~' verwenden wollen, müssen wir die Escapezeichenfolge in die Eingabeaufforderung einbetten." Sie können den vollständigen Pfad zum Basisverzeichnis durch Tilde durch Folgendes ersetzen: $ / \ ~} Chris Page vor 13 Jahren 1
Irgendeine Idee, ob dies mit SSH und Remote Shells funktionieren kann? cavalcade vor 9 Jahren 0
@MattTagg Sicher, Sie müssen es nur in Ihre `~ / .profile`-Datei (oder eine gleichwertige) Datei auf dem Remote-Computer einfügen. CoreDumpError vor 9 Jahren 1
30
Allisone

Kopieren und Einfügen in Datei ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;$\007\"; $PROMPT_COMMAND"

Dadurch wird der Titel des aktuellen Terminal-Registers auf den Namen des Ordners gesetzt, in dem Sie sich befinden (NICHT der gesamte Pfad).
Also ...
Developer/Applications/Utilities/Bluetooth/wird =>Bluetooth

Bei Mavericks ist die zu bearbeitende Datei ~ / .bash_profile Tom vor 10 Jahren 3
11
Chris Page

Ab Mac OS X Lion 10.7 verfügt das Terminal über eine explizite Escape-Sequenz zum Einstellen des Arbeitsverzeichnisses, das mit dem Standard-Fenstersymbol "Proxy" angezeigt wird. Auf diese Weise können Sie mit der Befehlstaste darauf klicken, um den Pfad anzuzeigen, im Finder anzuzeigen oder ihn wie einen anderen Ordner zu ziehen. Darüber hinaus kann das Terminal damit ein anderes Terminal im selben Verzeichnis erstellen und das Arbeitsverzeichnis beim Beenden / Neustarten des Terminals wiederherstellen (wenn Resume aktiviert ist). Außerdem können Verzeichnisse für Fenstergruppen wiederhergestellt werden.

Die OSC-Escape-Sequenz (Operating System Command, OSC) ist dieselbe wie für die Fenster- und Registerkartentitel, jedoch mit dem ersten Parameter auf 7. Der Wert sollte eine "file:" - URL sein, die die prozentuale Kodierung von Sonderzeichen ermöglicht, sodass sie verarbeitet werden kann alle gültigen Pfadnamen. Sie sollten auch den Hostnamen angeben, damit das Terminal feststellen kann, ob es sich um ein lokales Verzeichnis handelt. Das Terminal wird es vermeiden, es als aktuelles Arbeitsverzeichnis zu verwenden, wenn es von einem anderen Host stammt.

In einem verwandten Hinweis unterstützt Terminal ebenfalls das Festlegen der "dargestellten Datei" unter Verwendung der OSC-Escape-Sequenz mit einem Parameter von 6. Wenn dies festgelegt ist, zeigt das Proxy-Symbol dieses anstelle des Arbeitsverzeichnisses an. Zum Beispiel habe ich emacs und weniger konfiguriert, um die aktuell angezeigte Datei / Puffer im Proxy-Symbol anzuzeigen. Dadurch können diese tty-basierten Programme stärker in das umgebende Betriebssystem integriert werden.

Das Verhalten des Arbeitsverzeichnisses ist standardmäßig für bash aktiviert (die Standardshell unter Mac OS X). Siehe / etc / bashrc für den entsprechenden Code.

Es ist wahrscheinlich auch erwähnenswert, dass das Lion-Terminal jetzt die Einstellung des Registertitels unabhängig vom Fenstertitel mithilfe der OSC-Escape-Sequenz unterstützt.

Die `update_terminal_cwd`-Funktion setzt das Proxy-Symbol auf das aktuelle Arbeitsverzeichnis. Standardmäßig ist "$ PROMPT_COMMAND" "update_terminal_cwd". jtbandes vor 10 Jahren 0
@jtbandes Das war es, worauf ich mich bezogen habe, als ich schrieb: "Das Verhalten des Arbeitsverzeichnisses ist standardmäßig für Bash aktiviert ...". Chris Page vor 10 Jahren 0
Ja. Ich habe gerade entdeckt, wie es funktioniert und dachte, es könnte für zukünftige Googler nützlich sein! jtbandes vor 10 Jahren 0
2
dlamblin

Neben der Empfehlung, die Apple Terminal-spezifische Escape-Sequenz für Betriebssystembefehle zu verwenden: ESC ] Ps ; Pt BELWo Psist 7und Ptist eine file:URL; In Mac OS X 10.11 (und wahrscheinlich seit 10.7) gibt es eine Datei /etc/bashrc_Apple_Terminal(nicht editierbar unter 10.11), die das Bequemliche update_terminal_cwd()als (ohne die Kommentare) definiert:

update_terminal_cwd ()  {  local url_path=''; {  local i ch hexch LC_CTYPE=C LC_ALL=; for ((i = 0; i < ${#PWD}; ++i)) do ch="$"; if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then url_path+="$ch"; else printf -v hexch "%02X" "'$ch"; url_path+="%$"; fi; done }; printf '\e]7;%s\a' "file://$HOSTNAME$url_path" } 

Sie könnten dies auch auf Ihren Remote-Boxen verwenden, falls Sie darüber nachgedacht haben und dann den Kopf zerkratzen, wenn Sie die Datei-URL in Bash richtig kodieren.

Und wenn Sie ändern PROMPT_COMMANDin Ihrem eigenen .bash_profileoder .bashrcSie vielleicht vergessen, dies zu nennen. In derselben Datei zeigen sie ein Beispiel, wie sie etwas besser verkettet werden können:

PROMPT_COMMAND="update_terminal_cwd$" 

.bash_profileIch persönlich wollte in meiner git-Eingabeaufforderung Folgendes eingeben:

local git_path=/Applications/Xcode.app/Contents/Developer/usr/share/git-core for f in $git_path/git-completion.bash $git_path/git-prompt.sh do if [[ -f "$f" ]]; then . "$f" fi done get_sha() { git rev-parse --short HEAD 2>/dev/null } if [ "function" = $(type -t __git_ps1) ]; then export GIT_PS1_SHOWDIRTYSTATE=1 GIT_PS1_SHOWSTASHSTATE=1 GIT_PS1_SHOWUNTRACKEDFILES=1 GIT_PS1_SHOWCOLORHINTS=1 GIT_PS1_DESCRIBE_STYLE="branch" GIT_PS1_SHOWUPSTREAM="auto git" export PROMPT_COMMAND="$PROMPT_COMMAND$"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"' fi 
1
Michael Norrish

Bash-Lösungen mit PS1 und PROMPT_COMMAND schlagen beide fehl, wenn das Verzeichnis Unicode-Zeichen enthält (zumindest bei Snow Leopard). Die beste Lösung, die ich mir vorstellen konnte, war das Äquivalent

PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ " 

Leider funktioniert das nicht direkt, also habe ich eine Shell-Funktion definiert, um den trAufruf auszuführen:

termtitlefilter () { tr -dC '[\000-\177]'; } PS1="\[\033]0;\`pwd | termtitlefilter\`\007\]\$ " 

Dies funktioniert gut für lateinische Akzente, die in Unicode NFD (die Akzente werden verschwinden, der zugrunde liegende lateinische Charakter wird jedoch bleiben).

Unglücklicherweise wird es bei Dingen wie Chinesisch komplett scheitern.

Ab Mac OS X Lion 10.7 verfügt das Terminal über eine explizite Escape-Sequenz zum Einstellen des Arbeitsverzeichnisses. Es verwendet eine URL, sodass Sie die Prozent-Kodierung für Sonderzeichen verwenden und alle gültigen Pfadnamen unterstützen können. Siehe meine Antwort auf diese Frage für Details. Chris Page vor 13 Jahren 0
1
Kopz Kyoto

Angenommen, Sie verwenden das Standard-MAC-Terminal. Sie können das folgende in .profile verwenden, da "set_prompt" alleine Sie möglicherweise an den Stammordner sendet, wenn Sie eine neue Registerkarte öffnen:

set_prompt () { BASE_PATH="$" echo -ne "\033]0;$BASE_PATH\007" } set_my_tab () { update_terminal_cwd set_prompt }  PROMPT_COMMAND=set_my_tab 
0
kareman

Geben Sie dies in Ihre ~ / .profile oder eine gleichwertige Datei ein:

function settitle() { echo -n "]0;$@"; } function cd() { command cd "$@"; settitle `pwd -P`; }  export PS1='\W \$ '  settitle `pwd` 

Die erste Zeile enthält zwei Sonderzeichen, die nicht kopiert / eingefügt werden können. Der Text kann jedoch hier heruntergeladen werden: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .

"Die erste Zeile enthält zwei Sonderzeichen, die nicht kopiert / eingefügt werden können." Anstelle von "echo" verwenden Sie "printf", wodurch Sie diese Zeichen (ESC und BEL / Control-G) mit Escape-Sequenzen ausdrücken können: `printf ' \ e] 0; $ @ \ a "` Chris Page vor 13 Jahren 1