Byla vydána nová verze 1.54.0 sady nástrojů pro správu síťových připojení NetworkManager. Novinkám se v příspěvku na blogu NetworkManageru věnuje Jan Václav.
Knižní edice správce české národní domény přináší novou knihu zkušeného programátora Pavla Tišnovského s názvem Programovací jazyk Go. Publikace nabízí srozumitelný a prakticky zaměřený pohled na programování v tomto moderním jazyce. Nejedná se však o klasickou učebnici, ale spíše o průvodce pro vývojáře, kteří s Go začínají, nebo pro ty, kdo hledají odpovědi na konkrétní otázky či inspiraci k dalšímu objevování. Tištěná i digitální verze knihy je již nyní k dispozici u většiny knihkupců.
OpenAI zpřístupnila (en) nové nenáročné otevřené jazykové modely gpt-oss (gpt-oss-120b a gpt-oss-20b). Přístupné jsou pod licencí Apache 2.0.
Byla vydána RC verze openSUSE Leap 16. S novým instalátorem Agama, Xfce nad Waylandem a SELinuxem.
Google Chrome 139 byl prohlášen za stabilní. Nejnovější stabilní verze 139.0.7258.66 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 12 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře. S verzí 139 přestal být podporován Android 8.0 (Oreo) a Android 9.0 (Pie).
Společnost JetBrains se stala platinovým sponzorem multiplatformního open source herního enginu Godot. K vývoji her lze používat Rider for Godot. Zdarma pro nekomerční účely.
Byla vydána verze 9.0 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Verze 9.0 je založena na Debianu 13 Trixie. Přehled novinek v poznámkách k vydání a informačním videu.
Operátor O2 dává všem svým zákazníkům s mobilními službami poukaz v hodnotě 300 Kč na nákup telefonu nebo příslušenství jako omluvu za pondělní zhoršenou dostupnost služeb.
Společnost NVIDIA vydala verzi 13.0 toolkitu CUDA (Wikipedie) umožňujícího vývoj aplikací běžících na jejich grafických kartách. Přehled novinek v poznámkách k vydání.
Byly vyhlášeni vítězové a zveřejněny vítězné zdrojové kódy (YouTube, GitHub) již 28. ročníku soutěže International Obfuscated C Code Contest (IOCCC), tj. soutěže o nejnepřehlednější (nejobfuskovanější) zdrojový kód v jazyce C.
Aby bylo jasno, o čem bude řeč: Prompt, to je takové to user@localhost $ nebo třeba bash-4.1#, které vidíte v konzoli. Prompt lze nastavit tak, aby zobrazoval (vám) užitečné informace a navíc ještě vypadal dobře, což se vyplatí, trávíte-li v shellu aspoň nějaký čas.
Jak se to dělá? Nastavením proměnné PS1 na požadovanou hodnotu. Chcete-li například, aby výzva obsahovala pouze znak ">", nastavte PS1 takto:
PS1="> "
Aby toto nastavení přetrvalo i po ukončení shellu a použilo se pro další vytvořené shelly, přidejte deklaraci proměnné do souboru ~/.bashrc
či ~/.bash_profile
, pokud chcete nastavit prompt pouze pro uživatele, pod kterým pracujete, anebo do souboru /etc/bashrc
(případně /etc/bash/bashrc
, třeba na Gentoo), pokud chcete nastavit prompt pro všechny.
Pokud chcete používat takto chudý prompt např. z důvodu nedostatku místa na malé obrazovce mobilu, tak budiž, ale my si dále ukážeme, jak do promptu dostat nějaké užitečné informace. Manuálová stránka Bashe v sekci PROMPTING obsahuje přehled hodnot, které když do PS1 přidáte, tak se automaticky nahradí za požadovanou informaci. Některé z nich si vyjmenujeme a popíšeme:
/home/dave
) je zkrácen na tildu (~
)./tmp/x/y
, zobrazí y
).Předpokládejme počítač s názvem amd64.watzke.cz a uživatelem dave. Ukážeme si několik ukázkových zápisů PS1:
PS1="\u@\h \w \$ " # bude vypadat takto: dave@amd64 /tmp $ PS1="[\u \H \A \W]\$ " # [dave amd64.watzke.cz 16:55 tmp]$ PS1="\u [\j]> " # dave [2]>
Toto je základní způsob, jak do promptu dostat informace. Teď bychom je mohli ještě obarvit, jelikož to může zlepšit přehlednost a my pak rychleji najdeme tu konkrétní informaci, kterou zrovna hledáme. Obarvení se provádí tak, jak jsem nedávno popisoval v článku Barevný a formátovaný text v terminálu. Akorát je zde jedna maličkost. Přestože to funguje i bez toho, je vhodné přidat před každou escapovací sekvenci \[
a za ní pak \]
. Dělá se to z toho důvodu, aby Bash věděl, že jde o „netisknutelné“ znaky (pouze mění formátování, nevloží žádný znak) a nezapočítával je do délky promptu, protože to způsobuje problémy se zalamováním, když zadáte nějaký dlouhý příkaz. Takže třeba červeného textu docílíte takto:
\[\033[31\]Červený text…\[\033[0m\]
Jestli vám zápisy formátování připadaly nepřehledné předtím, teď to celé dostalo nový rozměr. Proto je vhodné uložit si jednotlivé barvy do proměnných a ty pak použít při tvoření PS1.
KONEC="\[\033[0m\]"
TYRKYSOVA="\[\033[36;1m\]"
CERVENA="\[\033[31;1m\]"
PS1="${TYRKYSOVA}\u${KONEC}@${CERVENA}\h${KONEC} \$ " # dave@amd64 $
Opět připomínám, že formátování je třeba ukončovat (proměnná KONEC
).
Tak už umíme sestavit barevný prompt. Je na čase si trochu rozšířit obzory. Jelikož lze do PS1 nacpat opravdu cokoliv a Bash svými speciálními sekvencemi typu \h pochopitelně nepokrývá všech nekonečno možností, je zde proměnná PROMPT_COMMAND
. Do této proměnné můžete vložit příkaz, který daný prompt vygeneruje a nastaví. Vhodné je nastavit proměnnou třeba takto:
PROMPT_COMMAND="source $HOME/.prompt.sh"
Ale ještě předtím je třeba vytvořit soubor ~/.prompt.sh
, ve kterém se proměnná PS1 nastaví. Může to být bashový skript se vším, co k tomu patří. Například můj prompt vypadá takto:
#!/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} "
Vlastně jediným důvodem, proč jsem si vytvářel skript na nastavení PS1, je nastavení barvy znaku dolaru, který je na konci. Barva závisí na návratové hodnotě naposledy spuštěného příkazu. Když je hodnota rovna 0 (příkaz se vykoná s úspěchem), dolar je žlutý, jinak je červený.
Ovšem pozor na to, vy si můžete vymýšlet daleko víc než já. Můžete si do promptu vložit výpisy z programů a podobně. Nic vám nebrání vložit tam třeba teplotu procesoru:
# tohle je velice specifický zápis (pro konkrétní senzorový čip),
# ale je to tak rychlejší než parsovat výstup příkazu sensors
CPU=$(( $(</sys/devices/platform/it87.656/temp1_input) / 1000 ))
# nastaví CPU_COLOR podle teploty procesoru
if [[ $CPU -gt 60 ]]; then
CPU_COLOR="$RED"
elif [[ $CPU -gt 50 ]]; then
CPU_COLOR="$YELLOW"
else
CPU_COLOR="$GREEN"
fi
# prompt bude vypadat takto: dave@amd64 [57°C]
PS1="\u@\h [${CPU_COLOR}${CPU}°C${END}] "
V případě, že se rozhodnete používat PROMPT_COMMAND
, stačí tuto proměnnou nastavit v některém ze souborů, kam byste jinak uložili PS1
(viz začátek článku).
Za zmínku stojí ještě proměnná PS2
. Řetězec, který drží, se vypíše s každým odřádkováním při psaní víceřádkového příkazu. Výchozí hodnota je "> ".
for((i=0;i<10;i++)); do > echo "číslo $i" > done # pro milovníky pythonního interpreteru PS2="... " for((i=0;i<10;i++)); do ... echo "číslo $i" ... done
Pokud používáte xterm
, můžete si nastavovat i titulek okna přidáním následující sekvence do proměnné PS1:
\[\033]0;Titulek\007\]
Pro přehlednost to můžete udělat až po nastavení PS1 takto:
case "$TERM" in xterm*) TITLEBAR="\[\033]0;cwd: \w\007\]" *) TITLEBAR="" esac PS1="$TITLEBAR\ $PS1"
Jak jsem teď naznačil v kódu, je vhodné kontrolovat, zda jsme v xtermu, nebo ne, protože na VT tato sekvence přidá nesmysly do promptu.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
PS1="\h@\u \w \$ " # bude vypadat takto: dave@amd64 /tmp $
je prohozené \h a \u.
\[\033[01;31m\]${?/#0/}\[\033[01;36m\]Hlavny trik je
${?/#0/}
, ktory zabezpeci vypis/nevypis podla navratovej hodnoty aj bez spustenia procesu.
$ echo $$ `if [[ 0 -eq 0 ]] ; then echo $$; fi` 10184 10184
$ echo $$ `ll /proc/self` 7651 lrwxrwxrwx 1 root root 64 2010-03-17 20:15 /proc/self -> 4123/
echo $$ echo `echo $$` echo `ls; echo $$`To vyzera, ze ani nerozlisuje, ci treba pustat novy proces alebo si vystaci sam, ale skutocne to vykonava v kontexte jedneho procesu
$ echo -e "$$ \n`ls -l /proc/self; echo $$`" 5287 lrwxrwxrwx 1 root root 64 2010-03-18 08:57 /proc/self -> 10210 5287
$$ Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the current shell, not the subshell.Ked som skusil nieco ako grep napisane v cistom bashi, tak sa pid meni:
$ echo $$ 6096 $ echo `while read l; do [[ "$l" == Pid:* ]] && echo "$l"; done </proc/self/status` Pid: 7667 $ echo `while read l; do [[ "$l" == Pid:* ]] && echo "$l"; done </proc/self/status` Pid: 7668Trocha to vidno na premennej BASH_SUBSHELL
$ echo $BASH_SUBSHELL 0 $ echo `$ echo $BASH_SUBSHELL` 1
echo $$ `echo \$\$` 18053 18053 echo $$; (eval echo '$$') 18053 18053 echo $$ ` (eval echo '\$\$') ` 18053 18053Pokud chcete definitivní odpověď, zkuste strace
it expands to the process ID of the current shell, not the subshell.aj pozdna expanzia vracia pid nadradeneho shellu. Nesfalsovanu hodnotu som ziskal z /proc/self/status. Ked som sa externym strace pripojil na bash a spustil
echo `echo \$\$`
, tak vo vypise syscallov je pipe
a hned za nim clone
. Takze proces sa vytvara.
Já kdysi používal něco takového, ale když se na to dívám zpětně, asi bych už takovou šílenost nikdy znovu nechtěl
jo tak tuhle zrudu jsem pouzival taky
Hehe, tak to je nás viac (resp. bolo)
Ja to mam takto a staci mi :
[ martin@~/workspace/ ]:16:25:^_^:
> qwert
bash: qwert: command not found
[ martin@~/workspace/ ]:16:39:-_-:
>
$ mc bash: mc: command not found