Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

.bashrcカスタマイズ完全ガイド:エイリアス・関数の追加方法と便利な設定テクニック

.bashrcファイルをカスタマイズすると、日々のワークフローが大幅に改善され、生産性を高めることができます。

.bashrcはLinuxのホームディレクトリに配置される標準的な設定ファイルです。この記事では、.bashrcで使える便利なオプション、エイリアス、関数などを詳しく紹介します。

.bashrcを設定する主なメリットは以下の通りです。

  • エイリアスを追加することで、コマンド入力が速くなり時間を節約できる
  • 関数を追加することで、複雑なコードを保存して再利用できる
  • 役立つシステム情報を表示できる
  • Bashプロンプトを自由にカスタマイズできる

.bashrc編集の始め方

まずはテキストエディタで.bashrcファイルを開いてみましょう。

$ vim ~/.bashrc

履歴(ヒストリー)関連の設定

Bashの履歴に日付と時刻のフォーマットを追加できます。

HISTTIMEFORMAT="%F %T "
# 出力例

$ history
 1017  20210228 10:51:28  uptime
 1019  20210228 10:52:42  free -m
 1020  20210228 10:52:49  tree --dirsfirst -F
 1018  20210228 10:51:38  xrandr | awk '/\*/{print $1}'

次の行を追加すると、重複するコマンドを履歴に記録しなくなります。

HISTCONTROL=ignoredups

アクティブな履歴の行数と、Bash履歴として保存される行数を設定するには、以下の2行を追加します。

HISTSIZE=2000
HISTFILESIZE=2000

履歴を上書きではなく追記するように設定することもできます。shoptは「shell options(シェルオプション)」の略です。

shopt -s histappend

デフォルトのシェルオプションをすべて確認するには、shopt -pを実行します。

# 出力例

$ shopt -p

shopt -u autocd                   
shopt -u assoc_expand_once        
shopt -u cdable_vars              
shopt -u cdspell                  
shopt -u checkhash                
shopt -u checkjobs                
shopt -s checkwinsize             
[...]

プロンプト用の色変数を定義する

変数を作成して、Bashプロンプトに色を付けることができます。

blk='\[\033[01;30m\]'   # 黒
red='\[\033[01;31m\]'   # 赤
grn='\[\033[01;32m\]'   # 緑
ylw='\[\033[01;33m\]'   # 黄
blu='\[\033[01;34m\]'   # 青
pur='\[\033[01;35m\]'   # 紫
cyn='\[\033[01;36m\]'   # シアン
wht='\[\033[01;37m\]'   # 白
clr='\[\033[00m\]'      # リセット

Vimユーザー向けの設定

Vim好きの方におすすめの設定です。これにより、コマンドライン上でVimのコマンドが使えるようになります。筆者が.bashrcに最初に追加するのは常にこの1行です。

set -o vi

.bashrcでエイリアスを作成する方法

頻繁に実行するコマンドにはエイリアスを使いましょう。エイリアスを作成すればタイプ量が減り、時間の節約と生産性の向上につながります。

エイリアスを作成する構文は alias <my_alias>='longer command' です。どのコマンドがエイリアス向きかを見極めるには、最もよく使う上位10個のコマンド一覧を表示する次のコマンドを実行してみてください。

$ history | awk '{cmd[$2]++} END {for(elem in cmd) {print cmd[elem] " " elem}}' | sort -n -r | head -10
# 出力例

171 git
108 cd
62 vim
51 python3
38 history
32 exit
30 clear
28 tmux
28 tree
27 ls

筆者はGitを頻繁に使うため、Gitコマンドはエイリアス化する絶好の候補です。

# Gitのステータスを確認する。
alias gs='git status'

# ファイルをGitに追加する。
alias ga='git add'

# すべてのファイルをGitに追加する。
alias gaa='git add --all'

# コードの変更をコミットする。
alias gc='git commit'

# Gitログを確認する。
alias gl='git log --oneline'

# 新しいGitブランチを作成し、同時にそのブランチへ移動する。
alias gb='git checkout -b'

# 差分を確認する。
alias gd='git diff'

その他にも便利なエイリアスがいくつかあります。

# 親フォルダへ移動する。
alias ..='cd ..;pwd'

# 2階層上の親フォルダへ移動する。
alias ...='cd ../..;pwd'

# 3階層上の親フォルダへ移動する。
alias ....='cd ../../..;pwd'
# 「c」キーでターミナル画面をクリアする。
alias c='clear'

# 「h」キーでBash履歴を表示する。
alias h='history'

# ディレクトリ構造を見やすく表示する。
alias tree='tree --dirsfirst -F'

# 親ディレクトリも含めて詳細表示付きでディレクトリを作成する。
alias mkdir='mkdir -p -v'
# 月の頭文字3文字を入力するだけでカレンダーを表示する。

alias jan='cal -m 01'
alias feb='cal -m 02'
alias mar='cal -m 03'
alias apr='cal -m 04'
alias may='cal -m 05'
alias jun='cal -m 06'
alias jul='cal -m 07'
alias aug='cal -m 08'
alias sep='cal -m 09'
alias oct='cal -m 10'
alias nov='cal -m 11'
alias dec='cal -m 12'
# 出力例

$ mar

     March 2021      
Su Mo Tu We Th Fr Sa 
    1  2  3  4  5  6 
 7  8  9 10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 29 30 31          

.bashrcで関数を使う方法

エイリアスでは対応できない、より複雑な処理には関数が便利です。

関数の基本構文は以下の通りです。

function funct_name() {
	# 処理内容;
}

ディレクトリ内の最大ファイルを検索する

ディレクトリ内で容量の大きいファイルを見つける方法です。

function find_largest_files() {
    du -h -x -s -- * | sort -r -h | head -20;
}
# 出力例

Downloads $ find_largest_files

709M	systemrescue-8.00-amd64.iso
337M	debian-10.8.0-amd64-netinst.iso
9.1M	weather-icons-master.zip
6.3M	Hack-font.zip
3.9M	city.list.json.gz
2.8M	dvdrental.tar
708K	IMG_2600.JPG
100K	sql_cheat_sheet_pgsql.pdf
4.0K	repeating-a-string.txt
4.0K	heart.svg
4.0K	Fedora-Workstation-33-1.2-x86_64-CHECKSUM
[...]

プロンプトに現在のGitブランチを表示する

Bashプロンプトに色を付け、現在のGitブランチを表示させることもできます。

# Bashプロンプトに現在のGitブランチを表示する。

function git_branch() {
    if [ -d .git ] ; then
        printf "%s" "($(git branch 2> /dev/null | awk '/\*/{print $2}'))";
    fi
}

# プロンプトを設定する。

function bash_prompt(){
    PS1='${debian_chroot:+($debian_chroot)}'${blu}'$(git_branch)'${pur}' \W'${grn}' \$ '${clr}
}

bash_prompt
.bashrcカスタマイズ完全ガイド:エイリアス・関数の追加方法と便利な設定テクニック

履歴から過去のコマンドを検索する

履歴をGrep(検索)して、以前実行したコマンドを探せます。

function hg() {
    history | grep "$1";
}
# 出力例

$ hg vim

305  2021-03-02 16:47:33 vim .bashrc
307  2021-03-02 17:17:09 vim .tmux.conf

Gitで新しいプロジェクトを開始する

Gitで新規プロジェクトを始める際の関数です。

function git_init() {
    if [ -z "$1" ]; then
        printf "%s\n" "Please provide a directory name.";
    else
        mkdir "$1";
        builtin cd "$1";
        pwd;
        git init;
        touch readme.md .gitignore LICENSE;
        echo "# $(basename $PWD)" >> readme.md
    fi
}
# 出力例

$ git_init my_project

/home/brandon/my_project
Initialized empty Git repository in /home/brandon/my_project/.git/

コマンドラインで天気予報を取得する

コマンドラインから天気予報を取得することも可能です。これにはcurljqパッケージと、OpenweathermapのAPIキーが必要です。自分の場所の天気を正しく取得できるよう、OpenweathermapのAPIドキュメントを読んでURLを適切に設定してください。

curlとjqは以下のコマンドでインストールできます。

$ sudo apt install curl jq

# または

$ sudo dnf install curl jq
function weather_report() {

    local response=$(curl --silent 'https://api.openweathermap.org/data/2.5/weather?id=5128581&units=imperial&appid=<YOUR_API_KEY>') 

    local status=$(echo $response | jq -r '.cod')

	# APIクエリ成功を示す200レスポンスかどうかをチェックする。
    case $status in
		
        200) printf "Location: %s %s\n" "$(echo $response | jq '.name') $(echo $response | jq '.sys.country')"  
             printf "Forecast: %s\n" "$(echo $response | jq '.weather[].description')" 
             printf "Temperature: %.1f°F\n" "$(echo $response | jq '.main.temp')" 
             printf "Temp Min: %.1f°F\n" "$(echo $response | jq '.main.temp_min')" 
             printf "Temp Max: %.1f°F\n" "$(echo $response | jq '.main.temp_max')" 
            ;;
        401) echo "401 error"
            ;;
        *) echo "error"
            ;;

    esac

}
# 出力例

$ weather_report

Location: "New York" "US"
Forecast: "clear sky"
Temperature: 58.0°F
Temp Min: 56.0°F
Temp Max: 60.8°F

.bashrcでシステム情報を表示する方法

ターミナルを開いたときに、役立つシステム情報を表示させることができます。

clear

printf "\n"
printf "   %s\n" "IP ADDR: $(curl ifconfig.me)"
printf "   %s\n" "USER: $(echo $USER)"
printf "   %s\n" "DATE: $(date)"
printf "   %s\n" "UPTIME: $(uptime -p)"
printf "   %s\n" "HOSTNAME: $(hostname -f)"
printf "   %s\n" "CPU: $(awk -F: '/model name/{print $2}' | head -1)"
printf "   %s\n" "KERNEL: $(uname -rms)"
printf "   %s\n" "PACKAGES: $(dpkg --get-selections | wc -l)"
printf "   %s\n" "RESOLUTION: $(xrandr | awk '/\*/{printf $1" "}')"
printf "   %s\n" "MEMORY: $(free -m -h | awk '/Mem/{print $3"/"$2}')"
printf "\n"

出力例:

.bashrcカスタマイズ完全ガイド:エイリアス・関数の追加方法と便利な設定テクニック

変更を反映させるには、.bashrcファイルを再読み込み(source)します。

$ source ~/.bashrc

すべてのカスタム設定をまとめた完全版

以下は、この記事で紹介したカスタム.bashrc設定をすべてまとめたものです。新しいシステムでは、デフォルトのコードの下にこれらのカスタマイズを貼り付けています。

######################################################################
#
#
#           ██████╗  █████╗ ███████╗██╗  ██╗██████╗  ██████╗
#           ██╔══██╗██╔══██╗██╔════╝██║  ██║██╔══██╗██╔════╝
#           ██████╔╝███████║███████╗███████║██████╔╝██║     
#           ██╔══██╗██╔══██║╚════██║██╔══██║██╔══██╗██║     
#           ██████╔╝██║  ██║███████║██║  ██║██║  ██║╚██████╗
#           ╚═════╝ ╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝
#
#
######################################################################

set -o vi

HISTTIMEFORMAT="%F %T "

HISTCONTROL=ignoredups

HISTSIZE=2000

HISTFILESIZE=2000

shopt -s histappend

blk='\[\033[01;30m\]'   # 黒
red='\[\033[01;31m\]'   # 赤
grn='\[\033[01;32m\]'   # 緑
ylw='\[\033[01;33m\]'   # 黄
blu='\[\033[01;34m\]'   # 青
pur='\[\033[01;35m\]'   # 紫
cyn='\[\033[01;36m\]'   # シアン
wht='\[\033[01;37m\]'   # 白
clr='\[\033[00m\]'      # リセット

alias gs='git status'

alias ga='git add'

alias gaa='git add --all'

alias gc='git commit'

alias gl='git log --oneline'

alias gb='git checkout -b'

alias gd='git diff'

alias ..='cd ..;pwd'

alias ...='cd ../..;pwd'

alias ....='cd ../../..;pwd'

alias c='clear'

alias h='history'

alias tree='tree --dirsfirst -F'

alias mkdir='mkdir -p -v'

alias jan='cal -m 01'
alias feb='cal -m 02'
alias mar='cal -m 03'
alias apr='cal -m 04'
alias may='cal -m 05'
alias jun='cal -m 06'
alias jul='cal -m 07'
alias aug='cal -m 08'
alias sep='cal -m 09'
alias oct='cal -m 10'
alias nov='cal -m 11'
alias dec='cal -m 12'

function hg() {
    history | grep "$1";
}

function find_largest_files() {
    du -h -x -s -- * | sort -r -h | head -20;
}

function git_branch() {
    if [ -d .git ] ; then
        printf "%s" "($(git branch 2> /dev/null | awk '/\*/{print $2}'))";
    fi
}

# プロンプトを設定する。
function bash_prompt(){
    PS1='${debian_chroot:+($debian_chroot)}'${blu}'$(git_branch)'${pur}' \W'${grn}' \$ '${clr}
}

bash_prompt

function git_init() {
    if [ -z "$1" ]; then
        printf "%s\n" "Please provide a directory name.";
    else
        mkdir "$1";
        builtin cd "$1";
        pwd;
        git init;
        touch readme.md .gitignore LICENSE;
        echo "# $(basename $PWD)" >> readme.md
    fi
}

function weather_report() {

    local response=$(curl --silent 'https://api.openweathermap.org/data/2.5/weather?id=5128581&units=imperial&appid=<YOUR_API_KEY>') 

    local status=$(echo $response | jq -r '.cod')

    case $status in
		
        200) printf "Location: %s %s\n" "$(echo $response | jq '.name') $(echo $response | jq '.sys.country')"  
             printf "Forecast: %s\n" "$(echo $response | jq '.weather[].description')" 
             printf "Temperature: %.1f°F\n" "$(echo $response | jq '.main.temp')" 
             printf "Temp Min: %.1f°F\n" "$(echo $response | jq '.main.temp_min')" 
             printf "Temp Max: %.1f°F\n" "$(echo $response | jq '.main.temp_max')" 
            ;;
        401) echo "401 error"
            ;;
        *) echo "error"
            ;;

    esac

}

clear

printf "\n"
printf "   %s\n" "IP ADDR: $(curl ifconfig.me)"
printf "   %s\n" "USER: $(echo $USER)"
printf "   %s\n" "DATE: $(date)"
printf "   %s\n" "UPTIME: $(uptime -p)"
printf "   %s\n" "HOSTNAME: $(hostname -f)"
printf "   %s\n" "CPU: $(awk -F: '/model name/{print $2}' | head -1)"
printf "   %s\n" "KERNEL: $(uname -rms)"
printf "   %s\n" "PACKAGES: $(dpkg --get-selections | wc -l)"
printf "   %s\n" "RESOLUTION: $(xrandr | awk '/\*/{printf $1" "}')"
printf "   %s\n" "MEMORY: $(free -m -h | awk '/Mem/{print $3"/"$2}')"
printf "\n"

まとめ

この記事では、ワークフローを大幅に改善し生産性を高めるために、さまざまな.bashrcのオプション、エイリアス、関数などの設定方法を学びました。ぜひ自分の環境に合わせてカスタマイズしてみてください。

  1. MacでChromecastをセットアップして使う方法【初心者向け完全ガイド】

    Google Chromecastは、スマートフォンやパソコンで再生できる動画・映画などのメディアを、テレビの大画面で楽しむための手頃な価格のデバイスです。ただし、MacでChromecastを使用する方法は、Windows PCやAndroidデバイスでの使い方とは少し異なります。そこで本記事では、MacでChromecastをセットアップして使用する方法を、初心者の方にもわかりやすく解説します。Part 1. MacでChromecastを使うために必要なものChromecastのセットアップは、Mac、iPhone、iPadのいずれかから簡単に行えます。セットアップを始める前に、以下の3

  2. Outlook用Teamsアドインのインストールと使い方をわかりやすく解説

    Microsoft Teamsは、ビデオ会議、職場チャット、ファイル保存、ドキュメント共有など、企業活動に必要なさまざまなサービスを提供するビジネスプラットフォームです。リモートワーク環境にある企業が組織を整え、従業員とより良い形でつながることを可能にしました。さらに、Microsoft TeamsとOutlookの連携が実現したことで、コミュニケーションはより簡単になっています。両方のプラットフォームを使うユーザー、特に企業で働く方にとって非常に効率的な機能です。この記事では、Outlook用Microsoft Teamsアドインのインストール方法について、連携の意味から具体的な手順まで詳