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履歴のサイズ、プロンプトの種類、および必要な cowsay インスタンスに関して、dash が bash とまったく同じように動作するかどうかです。

これが私の です.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

シェルには、スクリプトを実行することと、対話型のコマンド ラインを使用することの 2 つの用途があります。

Dash は、スクリプト用の高速で効率的なシェルとして設計されています。インタラクティブな使用に適した機能はほとんどありません。派手なプロンプト、コマンド ライン編集機能、コマンド履歴はありません。

dash をログイン シェルにすることができます。他の Bourne スタイルのシェルと同様に、 が読み込まれます~/.profile(bash は、bash 固有のものが存在しない限り、これを読み取ります)。dash は、ほとんどの最新の Bourne スタイルのシェルと同様に、対話的に実行されているときに~/.bash_profileも読み取ります。¹ENV

.bashrcインタラクティブに使用する場合は、より高性能なシェル (fish、zsh、bash など) を使用してください。他のシェルでも機能するエイリアス定義を除き、ほとんどのコードは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

または、コピーして~/.bashrc不要~/.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.

関連情報