lima icon indicating copy to clipboard operation
lima copied to clipboard

Fedora: 08-shell-prompt.sh: line 10: patch: command not found

Open VitoVan opened this issue 3 years ago • 5 comments

Description

limactl version 0.12.0

macOS 12.6

Fedora:

https://github.com/lima-vm/lima/blob/fc783ec455a91d70639f9a1d7f22e9890fe6b1cd/examples/fedora.yaml)

$ uname -a
Linux lima-default 5.17.5-300.fc36.x86_64 #1 SMP PREEMPT Thu Apr 28 15:51:30 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

-1. If you came here for a solution

  1. dnf install patch -y
  2. goto step 4, use that .bashrc to replace your current one

0. systemd Failed Units: 1

$ lima
[systemd]
Failed Units: 1
  cloud-final.service
[vito@lima-default ~]$

1. patch: command not found

$ sudo journalctl  -u cloud-final
...
Oct 07 10:59:17 lima-default cloud-init[841]: LIMA| Executing /mnt/lima-cidata/boot/08-shell-prompt.sh
Oct 07 10:59:17 lima-default cloud-init[841]: + '[' default = default ']'
Oct 07 10:59:17 lima-default cloud-init[841]: + grep -q '^# Lima PS1' /home/vito.linux/.bashrc
Oct 07 10:59:17 lima-default cloud-init[841]: + patch --forward -r - /home/vito.linux/.bashrc
Oct 07 10:59:17 lima-default cloud-init[841]: /mnt/lima-cidata/boot/08-shell-prompt.sh: line 10: patch: command not found
Oct 07 10:59:17 lima-default cloud-init[841]: LIMA| WARNING: Failed to execute /mnt/lima-cidata/boot/08-shell-prompt.sh
...

then I installed patch with sudo dnf install patch

2. Hunk ... FAILED at ...

$ sudo journalctl  -u cloud-final
...
Oct 07 11:08:10 lima-default cloud-init[834]: LIMA| Executing /mnt/lima-cidata/boot/08-shell-prompt.sh
Oct 07 11:08:10 lima-default cloud-init[834]: + '[' default = default ']'
Oct 07 11:08:10 lima-default cloud-init[834]: + grep -q '^# Lima PS1' /home/vito.linux/.bashrc
Oct 07 11:08:10 lima-default cloud-init[834]: + patch --forward -r - /home/vito.linux/.bashrc
Oct 07 11:08:10 lima-default cloud-init[834]: patching file /home/vito.linux/.bashrc
Oct 07 11:08:10 lima-default cloud-init[834]: Hunk #1 FAILED at 37.
Oct 07 11:08:10 lima-default cloud-init[834]: Hunk #2 FAILED at 56.
Oct 07 11:08:10 lima-default cloud-init[834]: 2 out of 2 hunks FAILED
Oct 07 11:08:10 lima-default cloud-init[834]: LIMA| WARNING: Failed to execute /mnt/lima-cidata/boot/08-shell-prompt.sh
...

3. Check ~/.bashrc

$ cat ~/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
    PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
        for rc in ~/.bashrc.d/*; do
                if [ -f "$rc" ]; then
                        . "$rc"
                fi
        done
fi

unset rc
# Lima BEGIN
# Make sure iptables and mount.fuse3 are available
PATH="$PATH:/usr/sbin:/sbin"
export PATH
# Lima END

4. Guess: you guys only made this for Ubuntu

Then I started an Ubuntu and copied the .bashrc to the Fedora.

.bashrc from Ubuntu
# ~/.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

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
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*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls 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'
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 -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# 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
# Lima BEGIN
# Make sure iptables and mount.fuse3 are available
PATH="$PATH:/usr/sbin:/sbin"
export PATH
# Lima END

Problem solved.

VitoVan avatar Oct 07 '22 11:10 VitoVan

Ironically the patch is not applied to Fedora anyway. It only applies to the Ubuntu (debian-based) prompt...

  • https://github.com/lima-vm/lima/pull/433

It came from the old days, when the default.yaml was based on ubuntu.yaml and instances weren't renamed

And it had some issues, like being totally illegible on a white background (since it was tested on a black one)

  • https://github.com/lima-vm/lima/pull/486

One alternative is to remove the feature and use a more boring PS1, or write a more portable for the new color...

afbjorklund avatar Oct 07 '22 16:10 afbjorklund

Here is the discussion regarding the new color.

  • https://github.com/lima-vm/lima/issues/268#issuecomment-1069351680

It's an honored tradition, ever since the bikeshed.

  • http://phk.freebsd.dk/sagas/bikeshed/

Compared with the ubuntu prompt. (with the "lime" color)

ubuntu-prompt

The one in fedora is rather boring. (since it is monochrome)

fedora-prompt

      case $TERM in
      xterm*|vte*)
        if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
            PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
        else
            PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
        fi
        ;;
      screen*)
        if [ -e /etc/sysconfig/bash-prompt-screen ]; then
            PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
        else
            PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
        fi
        ;;
      *)
        [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=/etc/sysconfig/bash-prompt-default
        ;;
      esac

afbjorklund avatar Oct 07 '22 16:10 afbjorklund

Colors aside, that script really should have looked for both patch and for a debian bashrc.

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

It was supposed to do nothing (--forward -r -), if being run somewhere else (than ubuntu)

afbjorklund avatar Oct 07 '22 16:10 afbjorklund

Colors aside, that script really should have looked for both patch and for a debian bashrc.

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

It was supposed to do nothing (--forward -r -), if being run somewhere else (than ubuntu)

Thanks for your words. :smile:

I will consider this as a proper solution with a boring PS1, rather than bikesheding a more portable one for the new color.

VitoVan avatar Oct 07 '22 22:10 VitoVan

It was only supposed to patch the ubuntu-lima distribution:

default-prompt

The goal was to make it different from the regular ubuntu:

ubuntu-prompt

But it never made it to the alpine-lima distribution either:

alpine-prompt

At least not by default, it is available in alpine if desired:

alpine-color

And the truecolor (> 256) didn't take effect until a restart:

truecolor-prompt

TERM=xterm-256color COLORTERM=truecolor

The real goal of the colors is to separate host, directory, and commands.

"the focus in a terminal window should be on the output of commands, not on the prompt"


A more "boring" PS1 could still have a way to indicate that it is a lima shell ?

I think @AkihiroSuda was thinking of something like PS1="[LIMA] $PS1"

This is similar to the discussion about using a red root prompt (not just a #)

  • https://bugzilla.redhat.com/show_bug.cgi?id=1228939 (anno 2015)

Alpine opted to make a color_prompt.sh available, but not enabled by default:

  • https://gitlab.alpinelinux.org/alpine/aports/-/issues/6933 (from 2017)

The hostname does have a "lima" in it already, so that is the hint otherwise...

Stealing 7 characters of precious screen real estate might not be appreciated ?

afbjorklund avatar Oct 08 '22 07:10 afbjorklund

@afbjorklund The chosen patching approach is fragile and breaks all OS except Ubuntu, not just Fedora.

To override the shell prompt in any OS it would be sufficient to append some snippet at the end of /etc/bashrc, but that is another discussion.

For the time being, would you accept a PR to skip this patching altogether if the OS isn't Ubuntu, until is has been decided how the Lima branding propagates to users' prompts?

antoineco avatar Oct 26 '22 21:10 antoineco

It was a nice hack at the time (well IMHO), but I'm fine with abandoning the Ubuntu patching for some other approach

But tried to avoid the other systems here:

  • https://github.com/lima-vm/lima/pull/1090

Normally the fedora example was called "fedora", so there was no risk of breaking things when changing the "default"

afbjorklund avatar Oct 26 '22 21:10 afbjorklund