abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 4
    včera 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 1
    včera 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    včera 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    24.4. 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    24.4. 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    24.4. 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (73%)
     (9%)
     (2%)
     (17%)
    Celkem 763 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Jak zvýraznit příkaz za promptem v bashi (UPDATE)

    5.6.2014 08:36 | Přečteno: 2110× | Tipy | Výběrový blog | poslední úprava: 22.6.2014 14:28

    V minulosti jsem psal článek o barvičkách v terminálu a o tom jak si nastavit vzhled promptu v Bashi. Tohle je tip, který s tím úzce souvisí – jak udělat, aby příkaz za promptem měl jinou barvu, než je výchozí barva textu v terminálu (aniž by to ovlivnilo výstup spouštěného příkazu).

    UPDATE: S odstupen času jsem bohužel našel vedlejší efekt, kvůli kterému je to prakticky nepoužitelné. Článek tu nechám, ale nedoporučuji to nastavovat. V posledním odstavci vysvětluji o co jde.

    Ten dodatek v závorce je klíčový, protože k té první části se dovtípí asi každý, už jen proto, že při počátečním experimentováním s barvami se to člověku může přihodit nechtěně – stačí, když se nenastaví výchozí neutrální barva pomocí speciální escape sekvence a další příkaz, který napíšete, včetně jeho výstupu (pokud sám nenastavuje barvy) má poslední nastavenou barvu / styl.

    Pokud nevíte o čem mluvím, zkuste si v bashi spustit tohle:

    unset PROMPT_COMMAND
    export PS1="\[\e[0m\]$PS1\[\e[36;1m\]"

    a potom napište a spusťte třeba:

    echo Test

    Pokud nemáte nějaký speciálně nastavený terminál, tak byste měli vidět příkaz i jeho výstup zbarvený do tyrkysova.

    Jenže záhada pro mě byla jiná věc – jak to udělat, aby se barva hned po potvrzení příkazu změnila na původní?

    Našel jsem na to poměrně elegantní trik na superuser.com. Ano, je to oblezlička, ale funguje mi docela spolehlivě. Je potřeba nastavit, aby bash odchytával a reagoval na signál DEBUG, který sám vysílá při každém odenterování příkazu. A reagovat bude samozřejmě tím, že nastaví zase barvu na výchozí.

    trap 'echo -ne "\e[0m"' DEBUG

    TL;DR

    Přidejte si do ~/.bashrc tohle:

    trap 'echo -ne "\e[0m"' DEBUG
    a podle toho, zda si nastavujete PS1 sami dynamicky pomocí PROMPT_COMMAND, anebo používáte statický prompt, tak si upravte nastavení proměnné PS1. Pokud nevíte, co jsem to právě napsal, tak zkuste pod ten trap do ~/.bashrc přidat ještě řádek:
    export PS1="\[\e[0m\]$PS1\[$(tput bold)\]"

    Spuštěním nové instance bashe ověřte, zda to funguje správně. Měl by být obarvený (resp. v tomto případě tučný) pouze příkaz, který zadáváte a ne jeho výstup.

    Motivace

    Když máte barevný prompt, tak není problém najít v jednolitém výstupu místo, kde to celé začíná, tak proč se obtěžovat s obarvováním příkazu? Když často spouštíte dlouhé a komplikované příkazy, tak vyvstane nový problém – i když najdete začátek příkazu, tak je někdy obtížné najít jeho konec, protože ten může splývat s výstupem příkazu. Když si příkaz obarvíte či zvýrazníte, odlišíte jej pak na první pohled.

    P.S.

    Přečtěte si i diskuzi, jsou tam další tipy. Např. je potřeba upravit i PS2 (tj. prompt druhé a další řádky příkazu, který se vypíše např. když odenterujete příkaz končící znakem \ anebo když neuzavřete text apostrofech/uvozovkách), nemá-li být její text zvýrazněný.

    export PS2="\[\e[0m\]$PS2\[$(tput bold)\]"
    A ještě jeden poznatek: tput sice zjednodušuje vkládání některých sekvencí, ale nepoužívejte ho v PROMPT_COMMANDu (resp. v souboru, který sourcuje), protože by to zbytečně forkovalo při každým zobrazení promptu.

    UPDATE - nenastavujte si to

    Bohužel jsem našel jeden hodně nepříjemnej vedlejší efekt, když jsem si nějakým cyklem v bashi generoval výstup, který jsem pak přesměroval do souboru. V tomto souboru se pak objevila část barevné escape sekvence, která tam samozřejmě neměla co dělat. Takže to není tak skvělé, jak jsem si na začátku myslel.

           

    Hodnocení: 100 %

            špatnédobré        

    Obrázky

    Jak zvýraznit příkaz za promptem v bashi (UPDATE), obrázek 1

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

    Komentáře

    Vložit další komentář

    xkucf03 avatar 5.6.2014 11:12 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi

    Pěkný hack, ale má to jednu drobnou vadu – když mačkám enter, aniž bych psal nějaký příkaz, mám tučně i prompt (nevyšle se DEBUG signál, který by nastavil písmo na normální).

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    David Watzke avatar 5.6.2014 11:13 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Tak tohle u sebe nepozoruju, ale mělo by to jít snadno obejít resetováním barvy na začátku PS1.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    xkucf03 avatar 5.6.2014 11:15 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi

    Snadná oprava:

    export PS1="\e[0m$PS1\[$(tput bold)\]"
    trap 'echo -ne "\e[0m"' DEBUG
    
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    xkucf03 avatar 5.6.2014 12:17 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    A ještě jeden problém: BASH completion (všechno tučně).
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    David Watzke avatar 5.6.2014 12:41 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Jo, to je pravda, i normální doplňování názvů souborů to dělá. No, je to vedlejší efekt, se kterým asi nepůjde nic moc dělat, protože znaky psaný do bashe žere readline a tu asi nepřesvědčíš, aby vygenerovala DEBUG signál pro bash (a i kdyby, kdoví jestli by to nezpůsobilo další vedlejší efekty).
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    5.6.2014 11:42 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Pěknej trik, debug jsem dřív používal na hrubý zobrazení doby trvání posledního příkazu, ale tohle je lepší využití...

    Pár poznatků: 1) nedoporučuju v PS1 používat $(), protože forkuje při každým zobrazení PS1, 2) PS2 je bold, ale ne že by to vadilo, dá se to samozřejmě pořešit...
    xkucf03 avatar 5.6.2014 12:12 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Vylepšená verze:
    export PS1="\e[0m$PS1\e[1m"
    export PS2="\e[0m$PS2\e[1m"
    trap 'echo -ne "\e[0m"' DEBUG
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    David Watzke avatar 5.6.2014 12:22 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Díky za připomínky!

    ad 1) to není pravda, pokud nastavuješ PS1 v .bashrc, protože tam se to expanduje a už se na to nesahá, ale je to pravda pokud jej nastavuješ přes PROMPT_COMMAND, ten se spouští pokaždé - zrovna tak je dobré se tomu vyhnout v tom trap, protože tam je příkaz v apostrofech, a tak se proměnná neexpanduje hned.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    5.6.2014 12:38 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Aha sorry já si nevšim, že tam máš uvozovky, ne apostrofy, tak to jo... Jinak PROMPT_COMMAND se evaluuje (to je krásný češtin :-D) v původním procesu, takže pokud tam člověk nenacpe $(), tak by forkovat neměl...
    Bystroushaak avatar 5.6.2014 12:23 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Příloha:
    Já jsem teď řešil zvýraznění return code a zároveň zkracování dlouhých cest. Nakonec jsem to poskládal z netu:
    GREEN="\e[1;32m"
    RED="\e[1;31m"
    WHITE="\e[m"
    EXIT_COLOR(){
        printf -- "$(_dir_chomp "$(pwd)" 40),"
        [[ 0 == "$1" ]] && printf -- "$GREEN$1" || printf -- "$RED$1";
        printf -- "$WHITE$"
    }
    
    _dir_chomp () {
        local IFS=/ c=1 n d
        local p=(${1/#$HOME/\~}) r=${p[*]}
        local s=${#r}
        while ((s>$2&&c<${#p[*]}-1))
        do
            d=${p[c]}
            n=1;[[ $d = .* ]]&&n=2
            ((s-=${#d}-n))
            p[c++]=${d:0:n}
        done
        printf -- "${p[*]}"
    }
    PS1='\u:$(EXIT_COLOR $?) '
    David Watzke avatar 5.6.2014 12:29 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Dva subshelly a jedno externí volání. $(pwd) by mělo jít zefektivnit na $PWD.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    5.6.2014 12:45 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Tohle je lepší řešit v PROMPT_COMMAND, kde se vyhneš těm subshellům. Mam to takhle:

    _ret_ok=$(echo -e '\e[0;32m✔\e[0m')
    _ret_bad=$(echo -e '\e[0;31m✖\e[0m')
    
    PROMPT_COMMAND='[ $? -eq 0 ] && _ret="$_ret_ok" || _ret="$_ret_bad$?";'
    PS1=' ${_ret} \D{%H:%M} \e[0;32m\u\e[0m \w \$ \e[1m'
    PS2='\e[0m> \e[1m'

    Screenshot.
    xkucf03 avatar 5.6.2014 12:54 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Pěkné :-) Do _ret_ok bych ještě přidal mezeru, aby to bylo zarovnané. A chybí mi tam název stroje.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    David Watzke avatar 5.6.2014 13:01 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Mezera zarovnání neřeší, protože retval může být tříznaková. Řešil by to printf "%3d" $exitcode nebo něco takovýho.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    David Watzke avatar 5.6.2014 13:10 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Vždyť tam máš dva subshelly hned na začátku :-)
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    5.6.2014 13:17 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Ty by se měly províst jen při zpracování .bashrc, pak už ne... Šlo by to i bez nich, když se tam ten escape nacpe rovnou, což je trochu prasárna a ábíčko mi to nebere, takže to sem nevložim :-D Nebo to jde líp?
    David Watzke avatar 5.6.2014 13:30 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    _ret_ok=$'\e[0;32m✔\e[0m'
    _ret_bad=$'\e[0;31m✖\e[0m'
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    5.6.2014 13:46 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Bystroushaak avatar 5.6.2014 13:34 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Trochu jsem to zrefactoroval, co tohle:
    GREEN="\e[1;32m"
    RED="\e[1;31m"
    WHITE="\e[m"
    DIR_CHOMP(){
        local IFS=/ c=1 n d
        local p=(${1/#$HOME/\~}) r=${p[*]}
        local s=${#r}
        while ((s>$2&&c<${#p[*]}-1))
        do
            d=${p[c]}
            n=1;[[ $d = .* ]]&&n=2
            ((s-=${#d}-n))
            p[c++]=${d:0:n}
        done
        printf -- "${p[*]}"
    }
    
    EXIT_COLOR(){
        DIR_CHOMP "$PWD" 40
        printf -- ","
        [[ 0 == "$1" ]] && printf -- "$GREEN$1" || printf -- "$RED$1";
        printf -- "$WHITE$"
    }
    PS1='\u:`EXIT_COLOR $?` '
    Zdá se mi to subjektivně rychlejší.
    xkucf03 avatar 5.6.2014 14:15 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi

    Proč funkce EXIT_COLOR() řeší adresáře? Minimálně bych ji přejmenoval na něco výstižnějšího, když už to má být takhle v jedné funkci.

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    Bystroushaak avatar 5.6.2014 14:46 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Proč funkce EXIT_COLOR() řeší adresáře? Minimálně bych ji přejmenoval na něco výstižnějšího, když už to má být takhle v jedné funkci.
    Funkce EXIT_COLOR() neřeší adresáře, řeší výpis $? + barvy. To volání adresářové funkce je nutné z EXIT_COLOR(), protože kdyby došlo k volání DIR_CHOMP() dříve, tak už by se nedostala k return value. Šla by tam přidat ještě třetí funkce, která to všechno poskládá dohromady, ale to už se mi zdá zbytečné.

    Jinak to chce místo
    PS1='\u:`EXIT_COLOR $?` '
    použít
    PS1='\u:\[`EXIT_COLOR $?`\] '
    jinak to silně blbne na konci řádku.
    xkucf03 avatar 5.6.2014 14:55 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    To volání adresářové funkce je nutné z EXIT_COLOR(), protože kdyby došlo k volání DIR_CHOMP() dříve, tak už by se nedostala k return value.

    Však ona ta struktura může zůstat stejná, jen bych to prostě přejmenoval – když si čtu PS1 a vidím tam nějaký EXIT_COLOR $?, tak čekám, že to asi vypíše obarvený kód – a ejhle, ono to dělá ještě něco jiného. Tady na tom až tolik nesejde, protože je to kód na pár řádků resp. člověk to vidí hned nad tím, co to dělá, ale stejně…

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    David Watzke avatar 5.6.2014 15:03 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Nestačilo by to volání DIR_CHOMP dát prostě pod definici funkce EXIT_COLOR (a nad PS1, který ji volá)?
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    David Watzke avatar 5.6.2014 15:05 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    To s tím \[blabla\] platí pro všechny barvy, i ty co máš definovaný výše, dělá to jinak nepředvídatelnej bordel (např. se nemůžeš vrátit kurzorem na začátek příkazu vytaženýho z historie a podobný prasečiny).
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Bystroushaak avatar 5.6.2014 15:22 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Funguje mi to jen v PS1. Všude jinde se to vloží tak jak jsem to uvedl.

    Co to vůbec má být tohleto?
    David Watzke avatar 5.6.2014 15:25 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    No, jsou to jen řídící sekvence, ale bash/readline je započítává jako znaky, takže když se ti pak má vrátit kurzor zpátky, tak je z toho nablblej - má špatný souřadnice. Tím \[ a \] mu řekneš, že to mezi tím nemá počítat.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    xkucf03 avatar 5.6.2014 15:47 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi

    On by ale neměl počítat jen ty řídící sekvence, jiné znaky (text) ano.

    Jak by mělo správně vypadat tohle?

    export PS1="\e[0m$PS1\e[1m"
    export PS2="\e[0m$PS2\e[1m"
    trap 'echo -ne "\e[0m"' DEBUG
    

    (to mi právě rozbilo editaci příkazů vytažených z historie)

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    Bystroushaak avatar 5.6.2014 16:05 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Příloha:
    Já jsem to teď vyřešil poměrně prasácky, ale funkčně. Ty hranaté závorky nepomůžou se vším, resp. ne když se do toho volá funkce. Pomohlo mi tohle: http://superuser.com/questions/367275/linux-coloring-bash-prompt-will-break-carriage-return
    GREEN="?\e[1;32m?"
    RED="?\e[1;31m?"
    WHITE="?\e[0m?"
    DIR_CHOMP(){
        local IFS=/ c=1 n d
        local p=(${1/#$HOME/\~}) r=${p[*]}
        local s=${#r}
        while ((s>$2&&c<${#p[*]}-1))
        do
            d=${p[c]}
            n=1;[[ $d = .* ]]&&n=2
            ((s-=${#d}-n))
            p[c++]=${d:0:n}
        done
        echo -ne "${p[*]}"
    }
    
    EXIT_COLOR(){
        DIR_CHOMP "$PWD" 40
        echo -n ","
        [[ $1 == 0 ]] && echo -ne "$GREEN$1" || echo -ne "$RED$1";
        echo -ne "$WHITE"
    }
    
    COMMAND_PROMPT=
    PS1='\u:`EXIT_COLOR $?`\$ '
    Podstatná je změněná definice
    GREEN="?\e[1;32m?"
    RED="?\e[1;31m?"
    WHITE="?\e[0m?"
    To sice může vypadá stejně, ale hned za/před uvozovkama jsou vložené znaky s ASCII kódem 1 a 2, které dělají to samé co \[ resp. \], které se ale nedají vložit do toho volání funkce (zkoušel jsem všechno možné, nedají - vypadá to, že PS1 unescapuje ty znaky ještě před tím, než zavolá tu funkci, takže tam potom už nejsou).

    Pokud se nepodaří HTML přenos, tak si je můžete vyrobit v interaktivním pythonu stylem:
    >>> print ">%s<" % chr(1)
    >?<
    >>> print ">%s<" % chr(2)
    >?<
    Zkopírovat a potom ručně odmazat > a <.
    David Watzke avatar 5.6.2014 16:29 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Tohle je nesmysl, použij prostě to co jsem psal kralykovi v #17
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Bystroushaak avatar 5.6.2014 17:57 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    To co jsi psal kralykovi v mém případě nefunguje (zkus to).
    5.6.2014 18:11 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Pokud ti vadí dlouhá cesta, možná bys měl nejjednodušší si napsat dvouřádkový PS1...
    Bystroushaak avatar 5.6.2014 19:24 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Já jsem ve věcech rozhraní velmi konzervativní a dvouřádkové PS1 by mi vadilo podstatně víc, než dlouhá cesta.
    David Watzke avatar 5.6.2014 20:17 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Ok, věřím. Teď jsem si teprv všiml, že používáš subshell v PS1, to je teda pěkný zlo.

    Já osobně používám tohle:

    v ~/.bashrc:
    export PROMPT_COMMAND='. ~/.prompt'
    v ~/.prompt:
    #!/bin/bash
    
    S=$?
    
    END="\[\e[0m\]"
    RED="\[\e[31;1m\]"
    CYAN="\[\e[36;1m\]"
    GREEN="\[\e[32;1m\]"
    YELLOW="\[\e[33;1m\]"
    
    if [[ $S -eq 0 ]]; then
            DOLLAR="${YELLOW}\$"
    else
            DOLLAR="${RED}\$"
    fi
    
    PS1="${CYAN}\u${END}@${RED}\h${END} ${GREEN}\w${END} ${DOLLAR}${END} "
    Vyhneš se subshellům a problémům s escapováním.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    5.6.2014 16:08 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Jeslti jsme se neupsal tak asi takto:
    export PS1="\[\e[0m\]$PS1\[\e[1m\]"
    export PS2="\[\e[0m\]$PS2\[\e[1m\]"
    
    mezi \[ \] a včetně se nezeapočítívá, takže pokud to nemá šířku, musí se to mezi to zavřít…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    David Watzke avatar 5.6.2014 16:27 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Přesně tak, opravil jsem to v zápisku. Mimochodem, do echa v tom trapu to nepatří, jenom do promptu.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    xkucf03 avatar 5.6.2014 16:31 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Dík, tohle už funguje pěkně.
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    xkucf03 avatar 7.6.2014 21:27 xkucf03 | skóre: 49 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi

    Tak jsem narazil ještě na jeden problém:

    $ echo ahoj
    ahoj
    
    $ (echo ahoj)
    ahoj
    
    $ (echo ahoj);
    ahoj
    
    $ time (date); echo ahoj
    So čen  7 21:26:45 CEST 2014
    
    real    0m0.003s
    user    0m0.000s
    sys     0m0.003s
    ahoj

    Výpisy po závorkách jsou tučně, i když by neměly.

    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
    5.6.2014 17:05 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    A já si říkal, proč mi to blbne :-D Dík.

    Mimochodem, ten, kdo vymejšlel escape sekvence, musel imho jet na nějakejch drogách (typuju nějaký amfetaminy), jsou totálně ulítlý.

    Například nasledující sekvence přesune kurzor o 3 znaky doprava: \e[3C. Teď záludná otázka: O kolik přesune znak sekvence \e[0C? Správně tušíte, že nula není správná odpověď, protože 0 = "chci default" a pro sekvenci CSI C je default 1, takže to přesune znak o 1 doprava. Aby to bylo zábavnější, různé sekvence mají různé defaulty, někdy 0, někdy 1, myslimže nějaká sekvence má dokonce default 100.

    Je ovšem možné vymyslet i mnohem zábavnější sekvence, např. tohle:

    echo -e '\e7\e[2\e[?2l\eH\eC\e<\e[2K\e[7m\e+0\eo`\en HAHA \eo`\e8'

    Jen tak vod voka říct, co tohle dělá, není úplně jednoduchý. Ale vyzkoušejte, nedělá nic špatnýho...
    David Watzke avatar 5.6.2014 17:08 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Hmm, to je slušný psycho :-D
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    5.6.2014 17:26 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak zvýraznit příkaz za promptem v bashi
    Aha, tak beru zpět to "nedělá nic špatnýho", některý emulátory terminálu nepodporují správně \e8 (GTK VTE-based terminály) :-D

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.