Portál AbcLinuxu, 30. dubna 2025 12:47

Návratový kód v PS1

3.9.2009 13:50 | Přečteno: 1639× | Výběrový blog

Včerejší sklizeň mě přiměla podělit se o jedno drobné vylepšení shellu které mě provází už značně dlouho.

Pro ty, co už na roota definitivně zanevřeli: v blbinkách byla zmíněna vtipná modifikace PS1 - smajlík který usmívá nebo mračí podle toho, jaký byl návratový kód posledního příkazu. Jako blbinka je to skvělé, ale pro praktické využití to má chybičky. Za prvé, nemám rád když se mi shellový příkaz zalamuje, takže šetřím každým znakem. Několika znakový smajlík je zbytečný. Ba co víc, signalizovat úspěch není vůbec potřeba. Naopak v případě neúspěchu by se hodilo vidět celý kód, a ne jen že je nenulový. A co je nejhorší, řešení s příkazy v PS1 nebo použití prompt_command znamená vyvolávání zbytečného podprocesu. Naštěstí samotný shell poskytuje všechno potřebné pro mnohem jednodušší řešení. Tady je (fanfára):

${?/#0/}

Dejte si to někam do PS1 a je hotovo. Je to jen expanze proměnné, žádný podproces se nespouští. Čtyři z pěti lachtanů doporučují obložit to nějakým výrazným obarvením, takže vznikne něco podobného následujícímu:

\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \[\033[01;31m\]${?/#0/}\[\033[01;34m\]\$\[\033[00m\]

Jestli vás zajímá jak to funguje, hledejte v manstránce bashe. Podobných skrytých perel je tam více.

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

3.9.2009 14:41 eoj
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Odpovědět | Sbalit | Link | Blokovat | Admin
\u \h \w \$ ? To je teda setreni znaku.
Prcek avatar 3.9.2009 14:49 Prcek | skóre: 43 | Jindřichův Hradec / Brno
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Tak zase člověk z toho promptu musí vyčíst nějaký užitečný informace, já třeba nemám rád, když je jako cesta napsaný jen aktuální adresář, k čemu mi to je? Já potřebuju vidět celou cestu.
Člověk je takový, jak vypadá... A já vypadám jako pravá, nefalšovaná děvka!!!
Michal Fecko avatar 3.9.2009 14:52 Michal Fecko | skóre: 31 | blog: Poznámkový blog
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Zlozvyky z Okien... odporučan príkaz pwd
Prcek avatar 3.9.2009 15:03 Prcek | skóre: 43 | Jindřichův Hradec / Brno
Rozbalit Rozbalit vše Re: Návratový kód v PS1
To bych neřekl, ve Windows jsem se do příkazové řádky stěží kdy podíval. Prostě je to pohodlnější, mít tu informaci rovnou na očích, než pořád vypisovat do terminálu pwd. Kdybych to měl dělat pokaždý, když zapomenu, kde jsem v adresářové struktuře, tak se upíšu :-).
Člověk je takový, jak vypadá... A já vypadám jako pravá, nefalšovaná děvka!!!
3.9.2009 15:04 Jan Grmela | skóre: 45 | blog: Kilo šťávy z lachtana | Brno
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Zvlášť když má člověk puštěných třeba deset terminálů zaráz, že :-)
multi avatar 3.9.2009 15:15 multi | skóre: 38 | blog: JaNejsemOdsut
Rozbalit Rozbalit vše Re: Návratový kód v PS1
asi myslel zlozvyk z pruzkumniku

jinak me osobne prave upla cesta dost vadi, koor kdyz je to na solarisech s jejich dlouhymi a hroznymi nazvy adresaru

jinak nejoptimalnejsi, vzhledem k tomu ze clovek je stejne hl v domovskem adresari je, kdyz se cesta zkrati pomoci "~/"
Michal Fecko avatar 3.9.2009 15:35 Michal Fecko | skóre: 31 | blog: Poznámkový blog
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Nie - myslel som Windows terminal...
Prcek avatar 3.9.2009 17:33 Prcek | skóre: 43 | Jindřichův Hradec / Brno
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Tak v domovským adresáři se cesta samozřejmě zkracuje pomocí ~, tak to je asi všude, ne?
Člověk je takový, jak vypadá... A já vypadám jako pravá, nefalšovaná děvka!!!
Václav 3.9.2009 15:58 Václav "Darm" Novák | skóre: 26 | blog: Darmovy_kecy | Bechyně / Praha
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Na to je nejlepší ZSH a jeho dva prompty.

Osobně to mám na pravé straně termu aktuální cestu, s tím že když k ní dopíšu příkaz, celá pravá část promptu zmizí
Cross my heart and hope to fly, stick a cupcake in my eye!
Marek Bernát avatar 3.9.2009 17:39 Marek Bernát | skóre: 17 | blog: Arcadia
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Ja to mám presne tak isto, ale nevedel som, že je to špeciálna vlastnosť zsh. V bashi sa to nedá? Booo, odpad :-)
physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
3.9.2009 15:04 Jan Grmela | skóre: 45 | blog: Kilo šťávy z lachtana | Brno
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Odpovědět | Sbalit | Link | Blokovat | Admin
Moc pěkné, díky. Doplním si o to svůj stále stejný letitý prompt.
3.9.2009 15:47 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Odpovědět | Sbalit | Link | Blokovat | Admin
Pekne, fakt pekne. Tiez som sa tym po tej spravicke 15 minut hral, ale nenapadlo ma riesenie bez dalsieho procesu (nemenil by dokonca ten dalsi proces aj hodnotu $?, takze by uz presna hodnota ani nesla zistit?).
If you hold a Unix shell up to your ear, you can you hear the C.
mirec avatar 3.9.2009 17:21 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Odpovědět | Sbalit | Link | Blokovat | Admin
function smail {
        if [ $? = 0 ]; then
                echo -ne '\033[00;32m:)\033[01;34m'
        else
                echo -ne '\033[01;31m:(\033[01;34m'
        fi
}

if [[ ${EUID} == 0 ]] ; then
        PS1='`smail` \[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
else
        PS1='`smail` \[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
fi
rulez
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
rADOn avatar 6.9.2009 20:53 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Návratový kód v PS1
hezky ale backticky jsou totez jako $() cili zase se pousti dalsi shell a tomu je IMO lepe se vyhnout
"2^24 comments ought to be enough for anyone" -- CmdrTaco
frEon avatar 4.9.2009 16:34 frEon | skóre: 40 | Praha
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Odpovědět | Sbalit | Link | Blokovat | Admin
husty, dik
Talking about music is like dancing to architecture.
vogo avatar 23.12.2009 20:45 vogo | skóre: 34 | blog: "Skládat papír"
Rozbalit Rozbalit vše Re: Návratový kód v PS1
Odpovědět | Sbalit | Link | Blokovat | Admin
Příloha:
$ cat /etc/profile.d/prompt.sh
#!/bin/bash
bash_prompt_command() {
        local LAST=$?
        if [ ${LAST} -eq 0 ]; then
                LAST=''
        else
                LAST="[\[\033[1;31m\]${LAST}\[\033[0m\]\[\033[1;30m\]]"
        fi

        local TIME=`date +%H:%M`
        local pwdmaxlen=20
        local trunc_symbol="..."
        local dir=${PWD##*/}
        pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
        local SHORT_PWD=${PWD/#$HOME/\~}
        local pwdoffset=$(( ${#SHORT_PWD} - pwdmaxlen))

        if [ ${pwdoffset} -gt "3" ]; then
                SHORT_PWD=${SHORT_PWD:$pwdoffset:$pwdmaxlen}
                SHORT_PWD=${trunc_symbol}/${SHORT_PWD#*/}
        fi

        if [ "$TERM" = "xterm" -o "$TERM" = "xterm-color" -o "$TERM" = "rxvt" -o "$TERM" = "xterm-xfree86" ]; then
                echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"
        fi

        if [ "$UID" = "0" ]; then
                local USER_HOST="\[\033[1;31m\]\h"
        else
                local USER_HOST="\[\033[1;32m\]\u\[\033[1;34m\]@\h"
        fi

        PS1="\[\033[1;30m\][\[\033[0;35m\]${TIME}\[\033[1;30m\]][${USER_HOST} \[\033[1;33m\]${SHORT_PWD}\[\033[1;30m\]]${LAST}\\$\[\033[0m\] "
}
PROMPT_COMMAND=bash_prompt_command

nejlepší prompt
Nejsem paranoidní, ale to ještě neznamená, že po mě nejdou.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.