BASH obsługuje $PROMPT_COMMAND
zmienną środowiskową, która definiuje polecenie, które należy wykonać przed dowolnym interaktywnym monitem pierwszego poziomu. Szukam ekwiwalentu tego ZSH.
Dokumentacja mówi, że istnieje funkcja, precmd
którą mogę zdefiniować, aby ją osiągnąć; nie mam jednak pojęcia, jak to zdefiniować na podstawie zmiennej środowiskowej.
Rozważałem przekazanie zmiennej środowiskowej, która zmusiłaby ZSH do odczytania pliku zawierającego definicję tej funkcji, ale ZSH nie wydaje się obsługiwać takich rzeczy : odczytuje tylko pliki globalne, a następnie pliki poszczególnych użytkowników. Mogę je zastąpić, ale nie mogę ich dodać bez modyfikacji plików, czego nie mogę zrobić.
Jak więc zdefiniować przechwytywanie przed monitem w ZSH za pomocą zmiennej środowiskowej, tak jak zrobiłbym to $PROMPT_COMMAND
w BASH?
źródło
exit
exec
;)
start() { eval "$@"; echo post-command-code }
a następnie skorzystaj z wiązania zle, aby wykonać wiersz komend zstart
rozszerzonym?DEBUG
Pułapka jest miły znaleźć, ale nadal masz problem, jak go zdefiniować. Ponownie udzieliłem odpowiedzi, ale pozostawiam wam napisanie własnej odpowiedzi dotyczącej rozwiązania pułapki DEBUG.:)
Odpowiedzi:
Najprostszym sposobem na emulację basha,
$PROMPT_COMMAND
który przychodzi mi do głowy, jest użycieprecmd
haka, jak już się zorientowałeś. Zdefiniuj to jakoi możesz zrobić coś takiego:
Zwróć uwagę na pojedyncze cudzysłowy w tym przykładzie, w przeciwnym razie
$(date)
zostaną rozwinięte zbyt wcześnie, tj. Już podczas definiowania,$PROMPT_COMMAND
a nie po wywołaniu przed pytaniem.Jeśli chcesz zachować (i nie chcesz zmieniać) istniejącą definicję, możesz zastosować to podejście:
Dzięki temu
prmptcmd
funkcje są wykonywane po istniejącejprecmd()
funkcji.Wreszcie, oto sposób, który jest odpowiedni do użycia w pakiecie programu, który nie powinien modyfikować plików użytkownika ani plików systemowych ani wprowadzać interaktywnych poleceń.
Przykładem odrodzenia sesji bash może być
Do spawnowania zsh możesz użyć
który powoduje
/program/dir/.zshrc
pozyskiwanie. W tym plikuprecmd()
zaczep można zdefiniować jak wyjaśniono powyżej. Jeśli chcesz, aby ustawienia użytkownika dodatkowo zawierałysource $HOME/.zshrc
itp. W .zshrc programu. Ta konfiguracja jest możliwa do utrzymania, ponieważ żadne pliki poza katalogiem programu nie są modyfikowane.Jako ostatni dodatek, oto dowód koncepcji, jak powitać nowego użytkownika również. Użyj następującego kodu w
/program/dir/.zshenv
pliku konfiguracyjnym rc:źródło
.zshrc
? (3) Na przykład:foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)
To Wykonujefoo()
ibar()
dodatkowo doprecmd()
.PROMPT_COMMAND="echo foo" bash
, prawda? Jest to możliwość dla tarła zsh:ZDOTDIR=/program/dir zsh
. Następnie/program/dir/.zshrc
na początku jest pozyskiwany, gdzie można zdefiniować hak precmd (). Jeśli chcesz, aby użytkownik dodatkowo uwzględniłsource $HOME/.zshrc
itp. W programie zshrc. Powinno to być łatwe w utrzymaniu, ponieważ żadne pliki poza katalogiem programu nie są modyfikowane.Jak stwierdza @mypy, Zsh
precmd
działa podobnie do BashaPROMPT_COMMAND
.Oto przykład, który działa dla Bash lub Zsh i nie używa
eval
:Uruchom ze skryptów inicjujących powłokę:
i:
Podpowiedzi tutaj są tylko przykładami. Z pewnością można zrobić znacznie trudniejsze rzeczy.
Aby uzyskać szczegółowe informacje na temat ustawiania funkcji pytania, patrz: http://zsh.sourceforge.net/Doc/Release/Functions.html#index-precmd i http://www.gnu.org/software/bash/manual/bashref.html # Drukowanie-Monituj .
Aby uzyskać szczegółowe informacje na temat szybkich rozszerzeń, zobacz http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html i http://www.gnu.org/software/bash/manual/bashref.html#Printing-a -Prompt .
źródło