🤡

CentOsでbashの設定をする②

2020/12/30に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くしはじめた。Linuxさんとさらに仲良くなるために自分が使いやすくなるようなシェルの環境を設定することにした。くーばねてす倒す。

概要

■シェル変数

■環境変数

■bashの設定ファイル

をまとめた

シェル変数

シェル変数とはシェル内部で使用される変数。色んな内容を保存して色んな変数名を設定することができるらしい。(説明が抽象的すぎる)

■シェル変数を設定する

変数名='値(内容)'

値は必ず''か""で囲むこと!
変数を設定するときは=の左右にスペースをあけない。
設定した変数は先頭に$をつけて参照することができる。

$ a='hello_world'
$ echo $a
hello_world

変数を作成するとき、基本的に任意の名前をつけることが出来るが幾つかの例外がある。
・英数字と_を使用すること
・先頭に数字をもってきてはいけない

■コマンド検索パスを設定する

$ PATHは、コマンドの検索に使用される環境変数だ。
たとえば、シェルで「ls」を実行すると、実際には/ bin / lsプログラムが実行される。これは、/ binが$ PATHにあるために発生する。正確な場所は、システム構成によって異なる場合がある。

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
(↑ディレクトリごとに:で区切られて表示される) 

個別にインストールしたアプリケーションや自作した独自のディレクトリをコマンド検索パスに含めたい時はPATH変数の値を変更する。
(後付けになるものはPATH変数にはいってなければフルパスじゃないと実行できない)
コマンドを配置する場所としては通常は~/binというディレクトリがよく使われる。
〜はホームディレクトリであるため、〜/ binは/ home / user / bin。通常のディレクトリだ。
↓新たなコマンド~/binをコマンド検索パスに追加する為には

$ PATH='$PATH:~/bin'

これで~/binの下に配置したコマンドもフルパスを指定せずにそのまま実行することができる。

■LANG設定~日本語?英語?~

LANGは日本語、英語などを設定できるシェル変数。
エラーメッセージを切り替えたいときはここで変更する。
言語や日付の書式はlocaleというプログラムを基準に切り替えられる。
localeで日本語は
ja_JP.UTF-8
英語は
en_US.UTF-8
↓なので日本語メッセージがいいときは

$ LANG=ja_JP.UTF-8

↓英語メッセージがいいときは

$ LANG=en_US.UTF-8

もちろん中国語もスペイン語もある。

$ locale -a

↑で設定できる色々な言語一覧が出せる。

■コマンド履歴関連のシェル変数

↓よく使われるシェル変数

HISTFILE     コマンドライン履歴を保存するファイル名が入ってる(~/.bash_history)
HISTFILESIZE   ファイルに保存するコマンドラインの最大行数(デフォルト値は500)
HISTSIZE     コマンドライン履歴を保持する最大行数(デフォルト値は500)

■シェルの状態に関するシェル変数

HOME    ホームディレクトリ
SHELL   ログインシェルのパス
PWD    カレントディレクトリ

もある!

環境変数

■環境変数とは

環境変数とはOSが提供するデータ共有機能の一つ。
色んなコマンドが起動されるが2種類のコマンドが存在する。外部コマンドと内部(組み込み)コマンド。
内部コマンドと外部コマンドの違いは実行ファイルが存在するかどうかである。
内部コマンド→コマンドプロンプト(パソコンさん)上どこでも実行できる。
外部コマンド→実行ファイルの場所でしか実行できない。
「CentOsでbashの設定をする①」エイリアス(短縮コマンドかどうか)の確認の記事でまとめたtypeコマンドでコマンドの実態が確認できる。

$ type cd
cd is a shell builtin(※組み込みコマンド)
$ type find
find is /usr/bin/find(※外部コマンド)
$ type ls
ls is aliased to `ls --color=auto'(※エイリアスで設定されたコマンド)

普通はシェル変数は外部コマンドから参照できないが、外部コマンドからも値を参照できるようにした変数が環境変数という。
通常だと共有できないけどデータ共有できるようにしたのが環境変数らしい…!(よくわからん!)
シェル変数も環境変数も同じ変数。種類が違うだけで
変数名='値'
という概念は変わらない。

シェル変数...シェルでしか使えない変数
環境変数.....同一コンピュータ内で(あるいは同一ユーザ内で)有効な変数。

シェル変数よりも有効範囲が広いのが環境変数。
※幅広い範囲で使えるようにしたものが環境変数っておぼえとく!

■シェルに設定されている環境変数一覧を表示

シェルに設定されている環境変数一覧を表示するにはprintenvコマンドを入力。

$ printenv
XDG_SESSION_ID=189
HOSTNAME=ip-172-31-$$-151.ap-northeast-1.compute.internal
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/usr/bin/printenv

色々な環境変数が出てきた!LS_COLORSそんなにたくさんのカラーがあったのか。

■環境変数の設定~exportコマンド~

環境変数をオリジナルで設定するにはexportコマンドを使う。
↓指定したシェル変数を環境変数に設定する。

$ export シェル変数名

↓lessコマンドに--no-init(コマンド終了時に画面を消去しない)オプションを付与してlessコマンドを実行するたびに自動付与する設定にする。lessコマンドにはLESSという環境変数が用意されているので

$ LESS='--no-init'(※シェル変数としてまず設定)
$ export LESS(※シェル変数を環境変数として設定)

↓ワンライナーでも設定できるぞ

$ export LESS='--no-init'(※export シェル変数名='値')

シェルで使うだけならコマンド短縮コマンドaliasで大丈夫なんじゃない?
コマンドに対して環境変数が用意しているってのはどこで参照できるんだろう。('_')

bashの設定ファイル

なんとここで驚愕の事実が判明した。色んな設定をここまでしてきたがbashを終了すると設定した内容が全部消えてなくなるらしい!

またログインしたときも同じ設定をするには、bashの設定ファイルを書かないといけない。
bashの設定ファイルは~/.bashrcに記述すればいい。
bashのファイルは色々あって

~/.bash_history   bash起動後に実行したコマンドの履歴が書き込まれるファイル
~/.bash_logout     ログアウトするときに実行されるファイル
~/.bash_profile   ログインしたときに読み込まれるファイル
~/.bashrc       bashを起動したときに読み込まれるファイル。ログイン時には読み込まれないが「.bash_profile」内で読み込むように設定されているとログイン時にも読み込まれる。

こんな感じ。
bashの設定はbashを起動するたびに毎回設定しないといけないので、bashを起動したときに読み込まれるファイルである~/.bashrcで設定しておけばほぼOK。

■bashの設定ファイルを書いてみよう!

bashの設定ファイルを編集する前に必ずバックアップを作っておこう。

$ cp .bashrc .bashrc.org

OK!あとbashファイル作成後間違った内容(例えばexit)を書いてしまうと二度とログインできないこともあるらしい。その為bash設定時はもう一つシェルを起動しておくといいらしい。
間違えた内容を記述してログインできなくなってしまったら予備シェルで設定ファイルを元に
戻す!ファミレスに居るときはtmuxさんも忘れない!
↓ちなみに自分の.bashrcファイルをのぞいてみた

$ cat  .bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

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

もっといっぱいでてくるのかと思ったけどこんなもんだったのか。増やしてくよ、bash。
この中にいままで書いてきたコマンドをかいていけばいいってことなのかな。

■コメントを残す

bashの設定ファイルにもコメントを残すことができる。
bashでは#から行の終わりまでコメントとして残すことができる。
コメントは動作に関係ないメモ書きでその部分は無視される。
行の途中からでも#を付けるとコメントとして認識される。

まとめ

今日もファミレスで勉強しているんだけど、tmuxさん起動し忘れてシンプルにセッションがきれた。#を4つ入力したら文字がグレーになった!

Discussion