Kolorowe monity w KornShell


11

Zgodnie z tym postem StackOverflow możliwe jest, że w KornShell pojawi się kolorowy monit. Nie byłem w stanie wymyślić, jak to zrobić. Jestem w stanie użyć koloru:

echo -e "\033[34mLinux\033[00m"

daje niebieski wynik „Linux”, podobnie jak:

printf "\033[34mLinux\033[00m"

Kiedy jednak włączam kody ucieczki do mojej PS1zmiennej zachęty, nie są one usuwane. Co muszę zrobić, aby uzyskać kolorowy monit? Poza tym, że jestem trochę frajerem dla oka, uważam, że kolorowe podpowiedzi przydają się podczas analizowania wyników.

Odpowiedzi:


10

Wystarczy użyć literowego znaku Esc, wprowadzonego za pomocą Ctrl- v, Esc(wyświetli się jak ^[na ekranie):

PS1="^[[34mLinux^[[00m"

Lub użyj danych wyjściowych echopolecenia, które okazało się skuteczne :

PS1="$(echo -e "\033[35mLinux\033[00m")"

W takich momentach zdaję sobie sprawę, że jestem jeszcze noobem z linii poleceń. Zwykle czuję się tak dobrze w porównaniu do moich przyjaciół. :) Pierwsza wersja działała ładnie; co za zgrabna sztuczka! Nie miałem sukcesu z drugą wersją. +1
Kazark,

5

Musisz wstawić dosłowny znak zmiany znaczenia w PS1zmiennej. Ksh88 i klony, takie jak pdksh i mksh (starsze wersje), nie mają dosłownej składni znaków kontrolnych, z wyjątkiem printwbudowanego. Mksh rozumie \eucieczkę, ale pdksh wymaga kodu ósemkowego \033.

PS1=$(print '\033[34mLinux\033[00m')

ATT ksh93 wprowadza składnię dosłowną unikającą luzów $'…'(dostępną także w mksh od R39b). Możesz użyć znaków odwrotnego ukośnika, aby wstawić znaki kontrolne w tych literałach.

PS1=$'\e[34mLinux\e[00m'

2
Właściwie mkshrównież wspiera $'…'- co prawda, ponieważ Dave Korn (Korn w Korn Shell) nalegał, abym go dodał.
mirabilos

@mirabilos Ah, dzięki. Prawdopodobnie wpisałem tę odpowiedź na maszynie z mksh R39 i nie sprawdziłem nowszych wersji.
Gilles „SO- przestań być zły”

2

Używam ich mkshdla użytkownika shell:

# custom prompt see http://comments.gmane.org/gmane.os.miros.mksh/126
PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^ | \a\e[36m\a${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo
\?)}@${HOSTNAME%%.*}\a\e[34m\a | ^ ^  ^ ^ | \a\e[0;33m\a$(local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~};
print -nr -- "$d")\a\e[1;34m\a |\n ^ ^  ^ ^ | \a\e[32m\a$(date +%H:%M)\a\e[34m\a | ^ ^ >>\a\e[0m\a '

i nieco inny shelldla root:

PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^  ^   \a\e[31m\a${USER:=$(ulimit -c 0; \
    id -un 2>/dev/null || echo \?)}@${HOSTNAME%%.*}\a\e[34m\a  ^ ^  ^ ^  ^ ^  ^   \a\e[0;33m\a$(
        local d=${PWD:-?} p=~
        [[ $p = ?(*/) ]] || d=${d/#$p/~}
        print -nr -- "$d"
)\a\e[1;34m\a  ^ ^ \n ^ ^  ^ ^  ^   \a\e[32m\a$(date +%H:%M)\a\e[34m\a  ^ ^  ^ ^   \a\e[0m\a '

wprowadź opis zdjęcia tutaj

Ponieważ znaki specjalne nie zostały skopiowane, oto pasta do wklejania dla zwykłego użytkownika i użytkownika root.


1

W odpowiedziach ludzi dzieje się kilka rzeczy, z których każda wymaga innej składni.

  1. Sekwencje specjalne dla programu terminalowego podane w dokumentacji.

  2. Jak zakodować końcowe sekwencje specjalne w zmiennej PS1, na przykład \ e lub dosłowne escape. To zależy od powłoki.

  3. Jak dodać zmieniające się informacje do monitu, na przykład nazwę hosta, bieżący katalog itp. Zależy to również od powłoki. Może być możliwe użycie specjalnych sekwencji odwrotnego ukośnika, takich jak \ w, dla katalogu roboczego, lub może być konieczne nazwanie zmiennych środowiskowych lub osadzenie wiersza poleceń w ciągu.

  4. Jak powiedzieć powłoce, które znaki drukują, a które nie. Powłoka nie wie, gdzie zaczynają się i kończą twoje sekwencje specjalne. Jeśli powłoka ma edytor wiersza poleceń lub coś podobnego, musi wiedzieć, które znaki są drukowane, aby wiedział, gdzie jest kursor. Bez tego szczegółu monit może wyglądać dobrze, ale edycja może zachowywać się dziwnie.

    • W bashu wstawiasz \ [przed każdą sekwencją zmiany znaczenia i \] po.

    • W ksh wybierasz pojedynczy niedrukowalny znak ASCII, który nie może wystąpić nigdzie indziej w ciągu. Na początku łańcucha piszesz ten znak, a następnie znak powrotu karetki ASCII. Następnie piszesz ten sam znak przed i po każdej sekwencji ucieczki. z3ntu wybrał \ a jako znak znacznika.


0

Dzięki poprzednim odpowiedziom i innym źródłom udało mi się wymyślić następujące:

Pytanie o powłokę Korna:

PS1="$(echo "\033[32m`logname`\033[35m@\033[32m`hostname` \033[33m`pwd`\033[36m\n\$\033[0m")"

Podpowiedź Bash:

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

Dają one ten sam kolor zachęty (tak, mówię po angielsku Queen;)) w formacie:

username@computername /current/working/directory
$

Odpowiednikiem DOS (choć nie ma opcji kolorów) jest:

prompt %username%@%computername% $P$_$G

co daje:

username@computername /current/working/directory
>

„>” Zachowuje „DOSsy” zamiast „nixy” za pomocą „$”, ale jeśli zamiast tego chciałbyś mieć sigil („$”), byłoby to:

prompt %username%@%computername% $P$_$$

Pod warunkiem, że twoje konto logowania ma wymagane uprawnienia, aby „nixies” na stałe poprzedzić je „eksportem”:

export PS1="..."

i zmień DOSsy na:

setx PROMPT "%username%@%computername% $P$_$G"

lub

setx PROMPT "%username%@%computername% $P$_$$"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.