Portál AbcLinuxu, 7. května 2025 07:32

Dotaz: Zjištění oddlílu podle current adresáře

16.1.2018 20:55 MilanC | skóre: 16
Zjištění oddlílu podle current adresáře
Přečteno: 252×
Odpovědět | Admin
Ahoj, snažím se vyřešit takovou věc. Cílem je zobrazovat jako součást promptu (rw) nebo (ro) podle toho, jestli je příslušný systém, na kterém se aktuálně nacházím mountnutý v ro/rw.

Takže jsem poeditoval /etc/bash.bashrc

set_bash_prompt() { fs_mode=$(mount | sed -n -e "s/^\/dev\/.* on \/ .*(\(r[w|o]\).*/\1/p") if [ "$fs_mode" == 'ro' ]; then PS1='\u@\h\[\033[01;31m\]${fs_mode:+($fs_mode)}\[\033[00m\]:\w\$ ' # elif [ "$fs_mode" == 'rw' ]; then # PS1='\u@\h\[\033[01;32m\]${fs_mode:+($fs_mode)}\[\033[00m\]:\w\$ ' fi }

PROMPT_COMMAND=set_bash_prompt

Má to ale jeden háček, nereflektuje to změnu adresáře. Např. když jsem na rw a udělám cd /boot (oddíl, který je ro), tak stále ukazuje rw. Háček je v tom zjišťování fs_mode, kde parsuje jen z root FS (/). Potřeboval bych nějak docílit, aby byl reflektován vždy aktuální adresář, tj. z něho zjištěn oddíl (správný řádek z mount). Tedy nějaký příkaz, jehož vstupem bude cesta a výstupem mountpoint, který mi pak poslouží při výběru správného řádku z mount (a zjištění ro/rw). Snad jsem to popsal srozumitelně.

Děkuji za nápady.

Řešení dotazu:


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

Odpovědi

16.1.2018 21:24 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Zjištění oddlílu podle current adresáře
Odpovědět | | Sbalit | Link | Blokovat | Admin
Místo
mount | sed ...
zkus dát
ls -ld .|cut -c 2,3
Aktuální oddíl se dá zjistit příkazem
df .
Oříznutý výsledek můžeš použít jako filtr do svého sedu.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 16.1.2018 21:25 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Zjištění oddlílu podle current adresáře
Odpovědět | | Sbalit | Link | Blokovat | Admin
if awk -v mountpoint=$(df --output=target --no-sync . | tail -1) '$2 == mountpoint { exit $4 ~ "^ro(,|$)"; }' /proc/mounts
then
    echo rw
else
    echo ro
fi
Hello world ! Segmentation fault (core dumped)
16.1.2018 22:09 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: Zjištění oddlílu podle current adresáře
Díky, pochopil jsem tuto část, která vrátí mountpoint do proměnné

mountpoint=$(df --output=target --no-sync . | tail -1)

Ale awk moc neumím. :( pak passneš tu variable mountpoint do awku, ale pak mi už moc není jasné co s čím porovnáváš. Dalo by se případně udělat, aby byl výstup ro/rw jako v tom původním případě? I když je to asi jedno. Zatím mi to ale nechce fungovat.
16.1.2018 22:22 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: Zjištění oddlílu podle current adresáře
Děkuji, funguje. :-) Ještě bych si dovolil poprosit o jednu radu s proměnnou.
        if awk -v mountpoint=$(df --output=target --no-sync . | tail -1) '$2 == mountpoint { exit $4 ~ "^ro(,|$)"; }' /proc/mounts
        then
                FSPERM="[\033[01;32m\](rw)\[\033[00m\]"
        else
                FSPERM="[\033[01;31m\](ro)\[\033[00m\]"
        fi

        PS1='\u@\h\$FSPERM:\w\$ '
Ať to zkouším jakkoli, tímto stylem se nebarví, ale vypisuje se obsah FSPERM. Zkoušel jsem třeba ${FSPERM}, PS1 dát do "..", naopak FSPERM do ' ' a různé kombinace. Lze to takto udělat nebo musím celé ty PS1 i s barvou dát do každé části podmínky? Děkuji.
16.1.2018 22:31 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: Zjištění oddlílu podle current adresáře
Tak už to mám. Děkuji oběma! Využil jsem nápovědy na Tvém webu (hacking-bash), takže řešení je... :-)
PS1='\u@\h\'$FSPERM':\w\$ '

Založit nové vláknoNahoru

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

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