prompt

Sziasztok.

Kicsit meguntam, hogy ha jó mélyen benn vagyok egy könyvtárban, a sor végén kell elkezdenem írni a parancsot. Amikor meg kapok egy szkrollozható parancssori kimenetet, az elejét úgy kell kibogozni...

Új sorba kerül a prompt, és függőleges vonallal jelzem, hol kezdődik.

# .bash.rc HEKK

if [ $(id -u) -eq 0 ];
then # root felhasznalokent:
    PS1="\e[0;31m┌──••[\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h:\w\a\]$PS1]\e[0;31m────\n💀\n└─# \e[1;32m"
else # normal userkent:
    PS1="\e[0;34m┌──••[\[\e]0;\u@\h:\w\a\]$PS1]────\n\e[0;34m└─> \e[0;37m"
fi

Rootként a vonalak átváltanak pirosra, és egy kedves kis halálfej is jelzi, hogy alvajáróként inkább máshol kotorásszak:
 

┌──••[user@gollum:~$ ]────
└─> cd ..
┌──••[user@gollum:/home$ ]────
└─> sudo bash
[sudo] user jelszava:       
┌──••[root@gollum:/home# ]────
💀
└─#

Kíváncsi vagyok, ki miként működteti a parancssorát. A csiliviliből itt is ki lehet nőni, ahogy az ember a compizból is visszatér az xfce4 alapjához. Viszont egy idő után a terminálon tényleg kiesik az ember szeme...

Hozzászólások

Ugyanezzel a problémával küzdöttem. Már nem tudom, hogy mi mit jelent,
de ez csak a közvetlen directorit írja ki : PS1=$"[./\W]$"
Pl : [./github]$

Ez nem jó. A dollárjel elé kell egy visszafelé perjel, mert anélkül mindig $-t fog kiírni jogkijelzésre, és nem fog átváltani #-re.

Egyébként nekem is hasonlóan egyszerű. Bash alatt PS1='\e[1;96m\w \e[1;95m\$ \e[0m' a beállítás, zsh-ban pedig PS1='%B%F{14}%~ %f%F{13}%# %f%b' volt. Mindkettő a teljes mappaelérési utat írja ki, és a jogkijelző karaktert, CGA kék-lila színsémában, a retró hatás kedvéért. A különbség csak annyi, hogy zsh alatt más formátumban kell megadni, meg zsh-ban egy weboldal ajánlása alapján % jelet használtam a nem rendszergazdai jogú usernek a szokásos $ helyett, ezt is csak azért, hogy látszódjon, hogy másik shellben vagyok.

Lehet szebbre kéne cicomázni, de jó így. Előtte sok évig a default, színek nélküli "user@hostname ~ $" formátumot használtam de ez csak akkor hasznos, ha sokféle user és sokféle host között ugrál az ember, pl. szerverekre SSH-zik be. Én viszont csak desktopnak használom a gépem, és csak egyféle userrel ügyködök, legtöbbször normál jogokkal, és csak ritkán adminjogokkal.

Kicsit igénytelenre van állítva, de a shellt magát nem használom sokat. Pedig szinte mindenre CLI, TUI, terminálos programokat, saját scripteket használok, de azok legtöbbször saját terminálablakukban nyílnak hotkey-re, és eleve saját színekkel, beállításokkal jönnek. Így hiába fut minden terminálban (alig pár alkalmazás kivétel csak, Firefox, Steam, Goldendict, játékok), magát a shell promptot nem kell sokat néznem, nem kell sokat gépelnem, nem kell mappákat váltogatnom.

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

shell alapismeretek:

"-páron belül bizonyos karakterek megtartják speciális jelentésüket. A \ például megtartja speciális jelentését, de csak bizonyos speciális karakterek előtt, mint pl. \ vagy $. Ellenben '-ok között elveszítik. Azaz lehet "-ek közé is rakni, de akkor erre is kell figyelni. (Azaz ezért kellett \\$ és ezért \W.) Ennél egyszerűbb aposztrófokat használni.

PS1='[./\W]\$ '

Lásd, amit a kolléga írt lentebb. Bár szerintem a ./ sem kell benne, a / mappában kicsit furcsán mutat, ha [.//] van elérési útként. Helyette: PS1="[\W] \$ " Fontos a szóköz a $ után, hogy a prompttal ne folyjanak egybe a bevitt parancsok.

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

Nem szeretem ezeket a több soros, emeletes promptokat, de ez mindenkinél megszokás, egyéni ízlés, felhasználási mód kérdése. Nekem ezek elvonják a figyelmem a parancsok kimenetitől.

Root shellhez a sudo bash helyett érdemesebb az su parancsot kiadni magában, ami az su root alaknak felel meg. Ez akkor is működik, ha nincs fent az adott gépen a Bash, hanem csak másmilyen shell, meg ha a rootnak másmilyen shell van beállítva, azt is tiszteletben tartja. Plusz nem minden gépen van sudo, BSD-ken pl. doas van helyette, amelyiken van sudo, ott nem biztos, hogy hozzá van adva a /etc/sudoers-ben, hogy sudo-val garázdálkodhat.

Épp így, ha csak fájlt akarsz rendszergazdai joggal szerkeszteni, akkor a sudo editorod /szerkesztendo/fajl helyett a sudoedit /szerkesztendo/fajl vagy sudo -e editorod /szerkesztendo/fajl formában érdemes kiadni, ez csak a fájlt éri el emelt jogosultságokkal, másolatot készít belőle a /tmp/-be, majd az editort már normál userként futtatja, és a végén emelt jogosultságokkal visszamásolja a fájlt az eredeti helyére, ha a tartalma megváltozott.

A sudo az ilyen senki földje igazából, kivételesen érdemes csak használni, 1-1 parancs erejéig. GUI-s alkalmazásnál meg a pkexec parancsot kell használni helyette, ami a polkitet használja. Aki GUI text editort használ, és az editorja fuse-képes (pl. gedit), az tudja a rendszergazdai jogot igénylő fájlokat admin:///szerkesztendo/fajl formában elérni, és csak az eléréshez fog jelszót kérni, de az editor nem fog rootként futni! Hasonlót tud az Emacs is. Így ha sudo-t használsz, nagyon gondold át, hogy 1) indokolt-e, 2) nem kéne-e helyette valami másik jogosultságemelő megoldást használni.

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

Az egyetlen különbség a su és a sudo su között, hogy az előbbi a root jelszavát kéri be, az utóbbi a parancsot kiadó user jelszavát. Ez utóbbi akkor praktikus, ha a root jelszót nem akarják kiadni. Meg mint mondtam, a sudo vagy nincs fent, vagy nincs engedélyezve a usernek, ezért biztosan (és rövidebb, lustáknak kényelmesebb) az egymagában kiadott su.

A kötőjelben igazad van, azt talán hasznos lehet a su után betenni, mert az a root beállításait inicializálja, környezeti változók, belép a root mappájába, de ez az esetek nagy részében nem szükséges. Sőt, a topikindító kollégának nem kívánatos, mert akkor a promptba betett haláli unicode-os halálfej emoji karakter nem fog neki megjelenni, hanem a root-nak rendszer szinten beállított PS1-ét kapja az arcába.

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

"Ez utóbbi akkor praktikus, ha a root jelszót nem akarják kiadni" - márpedig több adminos környezetben a root jelszó az borítékos, és használat után cserélendő, jobb esetben úgy, hogy mondjuk hárman adnak 4-4 karaktert a jelszóhoz, így biztosítva azt, hogy a teljes root jelszónak senki sincs birtokában.

"a topikindító kollégának nem kívánatos, mert akkor a promptba betett haláli unicode-os halálfej emoji karakter nem fog neki megjelenni" - az UID=0 -hoz tartozó PS1-et nem a pistike user beállításaiban kell megadni - ugyanis a pistike user beállításai rootként indított shell esetén nem kívánatos, hogy lefussanak, illetve hatással legyenek az immáron root userként futó munkamenetre.

Az enviro átvétel szerintem kellően fontos ahhoz, hogy figyeljünk rá. Ennek megfelelően vagy su - vagy sudo -i  amit használok, attól függően hogy root jelszó ismert vagy user jelszó van meg.

Egy sudo su - értelmét nem látom, egy sudo -u vagy sudo bash meg nem veszi át a környezetet, így az user $HOME-ban hirtelen root tulajdonosú .bash_history jelenik meg meg egyéb nyalánkságok, ami később mezei userként nem fogja könnyebbé tenni az életet.

    PS1="\e[0;34m┌──••[\[\e]0;\u@\h:\w\a\]$PS1]────\n\e[0;34m└─> \e[0;37m"

                                                     ^^^^^^^^    ^^^^^^^^

Ezeket rakd \[ és \] közé, különben a sorszerkesztés csúnyán bugos lesz.

Szerkesztve: 2021. 08. 03., k – 19:06

íme a Kali lunuxból egy kiforrottabb többsoros megoldás, jelenleg ennél maradok. Többoldalas parancssori kimeneteknél valóban jól láthatóvá teszi a visszakeresést az a csodavonalazás... A sorok száma itt már csak 2, nem 3.

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

# The following block is surrounded by two delimiters.
# These delimiters must not be modified. Thanks.
# START KALI CONFIG VARIABLES
PROMPT_ALTERNATIVE=twoline
NEWLINE_BEFORE_PROMPT=yes
# STOP KALI CONFIG VARIABLES

if [ "$color_prompt" = yes ]; then
    # override default virtualenv indicator in prompt
    VIRTUAL_ENV_DISABLE_PROMPT=1

    prompt_color='\[\033[;32m\]'
    info_color='\[\033[1;34m\]'
    prompt_symbol=㉿
#    prompt_symbol=☣️
#    prompt_symbol=☢️ 
    if [ "$EUID" -eq 0 ]; then # Change prompt colors for root user
        prompt_color='\[\033[;94m\]'
        info_color='\[\033[1;31m\]'
        prompt_symbol=💀
    fi
    case "$PROMPT_ALTERNATIVE" in
        twoline)
            PS1=$prompt_color'┌──${debian_chroot:+($debian_chroot)──}${VIRTUAL_ENV:+(\[\033[0;1m\]$(basename $VIRTUAL_ENV)'$prompt_color')}('$info_color'\u${prompt_symbol}\h'$prompt_color')-[\[\033[0;1m\]\w'$prompt_color']\n'$prompt_color'└─'$info_color'\$\[\033[0m\] ';;
        oneline)
            PS1='${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV)) }${debian_chroot:+($debian_chroot)}'$info_color'\u@\h\[\033[00m\]:'$prompt_color'\[\033[01m\]\w\[\033[00m\]\$ ';;
        backtrack)
            PS1='${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV)) }${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ';;
    esac
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*|Eterm|aterm|kterm|gnome*|alacritty)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

[ "$NEWLINE_BEFORE_PROMPT" = yes ] && PROMPT_COMMAND="PROMPT_COMMAND=echo"

# enable color support of ls, less and man, and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
    alias diff='diff --color=auto'
    alias ip='ip --color=auto'

    export LESS_TERMCAP_mb=$'\E[1;31m'     # begin blink
    export LESS_TERMCAP_md=$'\E[1;36m'     # begin bold
    export LESS_TERMCAP_me=$'\E[0m'        # reset bold/blink
    export LESS_TERMCAP_so=$'\E[01;33m'    # begin reverse video
    export LESS_TERMCAP_se=$'\E[0m'        # reset reverse video
    export LESS_TERMCAP_us=$'\E[1;32m'     # begin underline
    export LESS_TERMCAP_ue=$'\E[0m'        # reset underline
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

A kimenet ezután szintén megváltoztatja a vonal színét root esetén, de a promptot is, és egy kedves kis halálfej jelzi a veszélyes üzemmódot:
 

┌──(user㉿gepnev)-[~]
└─$ sudo bash
[sudo] a jelszava:       
┌──(user💀gepnev)-[~]
└─# cd /

┌──(root💀gepnev)-[/]
└─# 

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Nekem nagyon megtetszett :-)

Ami a legfontosabb: ha mélyen benne vagyok egy könyvtárstruktúrában, nem a sor végén kell bogarásznom a prompt után.

Felpakoltam minden distribemre, persze néhol biohazardra változtatva az emojt.

Viszont mivel az emoj X nélkül megy a levesbe, azt szerintem szanálom.

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Nem kell szanálni az emojit. Be tudod állítani, hogy külön PS1 prompt legyen akkor, ha a Bash érzékeli, hogy virtuális tty-ból/terminálból fut, és külön PS1 prompt, ha nem. Pl.

if [[ $TERM == "x_terminálod_neve" ]]
then 
 export PS1="emojis_cumó"
else
  export PS1="alternatív_tty_prompt"
fi

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

if [ -n "$PS1" ]; then
    if [ "$EUID" = "0" ]; then
        export PS1="\n\[$Red\]┌─\u:\[$Cyan\][\w]\[$Red\] \n└──\\$ \[$NC\]"
    else
    export PS1="\n\[$Green\]┌─\u:\[$Yellow\][\w]\[$Green\] \n└──\\$ \[$NC\]"
    fi
fi
 

Szerkesztve: 2021. 08. 04., sze – 14:30

Van, amikor környezeti változó is jól jön a promptban...:

PS1="\[\e[3;36m\][\t] \u@\h:\w \[\e[0;31m\]ORACLE_SID=\$ORACLE_SID\[\e[0m\] \\$ "