Может ли dash заменить bash в качестве оболочки по умолчанию?

Может ли dash заменить bash в качестве оболочки по умолчанию?

Из того, что я прочитал, dashможно сделать оболочку, используя команду

~$ chsh shirish
Password: 
Changing the login shell for shirish
Enter the new value, or press ENTER for the default
    Login Shell [/bin/bash]: 

Мне просто нужно установить dash и указать путь к оболочке входа /bin/dash. Если я это сделаю, он не будет читать, .bashrcно, вероятно, будет читать .profile. Это мой, .bashrcмогу ли я просто скопировать и вставить, .bashrcи dash будет вести себя точно так же, как bash, в отношении размера истории, типа приглашения и экземпляра cowsay, который мне нужен или нет?

Вот мой .bashrc.

$ cat .bashrc
# ~/.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=3000
HISTFILESIZE=3000
HISTTIMEFORMAT="%F %T"

# 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) 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

# enable bash completion in interactive shells
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

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)}\t \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   cls='clear'
    alias    ll='ls -l'
    alias aptfn='sudo aptitude forget-new'
    alias  aptn="aptitude search '~N'"
    alias    gi='bash /home/shirish/git-info.sh'
    alias  apto='aptitude search ~o'
    alias  grep='grep --color=auto'
    alias  aptc="aptitude search '~c'"
    alias  copy="rsync --progress -ravz"
    alias   vlc="vlc -vv"
    alias   tor="/home/shirish/.local/share/torbrowser/tbb/x86_64/tor-browser_en-US/start-tor-browser"

    #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

# some more ls aliases

#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

# from http://askubuntu.com/questions/16428/showing-a-cowsay-fortune-in-every-new-terminal-session

if [ -x /usr/games/cowsay -a -x /usr/games/fortune ]; then
    fortune | cowsay

решение1

Оболочки имеют два назначения: для запуска скриптов и для интерактивной командной строки.

Dash разработан как быстрая и эффективная оболочка для скриптинга. Он практически не имеет приятных функций для интерактивного использования. Он не имеет замысловатых подсказок, функций редактирования командной строки или истории команд.

Вы можете сделать dash своей оболочкой входа. Она будет читать , как и другие оболочки в стиле Bourne (bash читает его, если только не присутствует ~/.profilebash-specific ). Dash также читает , когда он работает в интерактивном режиме, как большинство современных оболочек в стиле Bourne.¹~/.bash_profileENV

Для интерактивного использования используйте более функциональную оболочку: fish, zsh или bash. Большая часть кода в вашем .bashrcспецифична для bash, за исключением определений псевдонимов, которые будут работать в других оболочках.

Рекомендуемая дополнительная литература:Разница между оболочкой входа и оболочкой без входа?

¹ Некоторые старые оболочки в стиле Bourne считывали ENV, когда они начинали неинтерактивно, но я не думаю, что какая-либо современная версия делает это. Ash прекратил делать это в 2001 году.

решение2

Многие команды в вашем .bashrc-специфичны bash. Такие вещи, как HISTCONTROLне имеют отношения к dash. То же самое касается завершения команды. Однако псевдонимы будут работать.

Прочитайте страницу руководства dashи проверьте страницу руководства для каждой вещи, которую вы делаете в своей работе, .bashrcчтобы узнать, применимо ли это к dash.

Настоящий вопрос, который вы задаете, не очень ясен: вы просто хотите dashустановить как /bin/sh, или вы также действительно хотите, чтобы dash был вашей оболочкой входа? Если последнее, то chshэто правильный путь; в противном случае вам просто нужно установить, dashи установка спросит, хотите ли вы, чтобы dash был системной оболочкой по умолчанию (и затем выберите «да»). Если вы хотите изменить свой ответ, запустите dpkg-reconfigure dash.

решение3

Вы можете легко попробовать все самостоятельно и убедиться, что все работает, не меняя текущую оболочку входа.

За исключением /etc/profileи ~/.profile, при интерактивном запуске dashбудет прочитан файл, на который указывает переменная окружения, поэтому:ENV

ENV=~/.bashrc dash

или лучше сделайте копию вашего ~/.bashrcto ~/.dashrcи закомментируйте/удалите то, что вам не нужно/не работает. Как только у вас будет все, что вам нравится, вы можете добавить строку

ENV=~/.dashrc

на свой ~/.profileи измените оболочку по умолчанию.

От man dash:

 ...   If the environment variable ENV is set on entry to an interac‐
 tive shell, or is set in the .profile of a login shell, the shell next
 reads commands from the file named in ENV.  Therefore, a user should
 place commands that are to be executed only at login time in the
 .profile file, and commands that are executed for every interactive
 shell inside the ENV file.  To set the ENV variable to some file, place
 the following line in your .profile of your home directory

       ENV=$HOME/.shinit; export ENV

 substituting for “.shinit” any filename you wish.

Связанный контент