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

.bashrcを活用して、半分のキーストロークで2倍の作業を実現する方法

以前「BashスクリプトでUbuntuをセットアップする方法」に関する記事の中で、.bashrcの魔法について少しだけ触れました。しかしそれではその魅力を十分にお伝えできなかったため、このBash設定ファイルで何ができるのか、もう少し詳しく解説する記事を書くことにしました。

現在の私の設定はワークフローを大幅に改善し、設定なしの場合と比べて50%以上のキーストロークを節約してくれています!ここでは、より少ないキー入力で効率化を図るためのエイリアス、関数、プロンプト設定の具体例を見ていきましょう。

Bashエイリアス

上手に書かれた.bashrcは、膨大なキーストロークを節約できます。文字通りの意味でこれを活かすのがBashエイリアスです。エイリアスとは、入力した短い文字列がより長いコマンドへ展開される仕組みのこと。まずは、ターミナルでファイルをコピーするためのBashエイリアスの例から見てみましょう。

# 常にディレクトリの内容を再帰的(r)にコピーし、実行内容(v)を表示する
alias cp='cp -rv'

aliasコマンドは、入力する文字列と、その文字列が展開される先のコマンドを定義します。cpのような既存のコマンドも上書き可能です。単体のcpコマンドはファイルしかコピーせず、ディレクトリは対象にならず、しかも成功しても何も表示されません。このエイリアスがあれば、2つのフラグを毎回指定する必要も、コピー先でcdlsを実行して確認する必要もありません!cpのたった2回のキー入力で、すべてが完了します。

よく使うコマンドにフラグを渡すための.bashrcエイリアスをいくつか紹介します。

# ファイルタイプごとの色分け、隠しファイル(A)(. と .. は除く)、(C)列形式、種類インジケーター(F)付きで一覧表示
alias ls='ls --color=auto -ACF'
# ファイルタイプごとの色分け、すべ(a)ての隠しエントリ(. と .. を含む)、(l)詳細形式、種類インジケーター(F)付きで一覧表示
alias ll='ls --color=auto -alF'

# ファイル移動時に実行内容(v)を表示
alias mv='mv -v'
# 存在しない親ディレクトリ(p)を作成し、実行内容(v)を表示
alias mkdir='mkdir -pv'
# 部分的にダウンロード済みのファイルの続き(c)を常に取得
alias wget='wget -c'

長いコマンドの入力を避けたいときにも、エイリアスは大いに役立ちます。Python環境での作業に使っているものをいくつか紹介します。

alias pym='python3 manage.py'
alias mkenv='python3 -m venv env'
alias startenv='source env/bin/activate && which python3'
alias stopenv='deactivate'

Bashエイリアスで時間を節約するアイデアをもっと知りたい方は、関連記事の豊富なサンプル集を参考にするとよいでしょう。

Bash関数

上記のエイリアスには1つ弱点があります。それは挙動が固定されている点です。宣言されたテキストに常に正確に展開されるため、引数を受け取るエイリアスが必要な場合は、代わりに関数を作成します。次のように記述します。

# ディレクトリ移動後にその中身を表示する
function cd () {
    builtin cd "$1"
    ls -ACF
}

cdと入力した直後にlsを打って、今いるディレクトリの中身を確認した回数は数え切れません。この関数を設定しておけば、たった2文字でそれがすべて実現します!この関数は最初の引数$1を移動先として受け取り、そのディレクトリの内容をファイルタイプインジケーター付きの整形された列で表示します。builtinの部分は、デフォルトコマンドの上書きをBashに許可させるために必要です。

ソフトウェアのダウンロードやアップグレードの場面でも、Bash関数は非常に強力です。以前は静的サイトジェネレーターHugoの新版をダウンロードするのに、リリース頻度の高さゆえに2週間ごとに数分を要していました。関数を使えば、バージョン番号を渡すだけで数秒でアップグレードが完了します。

# Hugoのインストールまたはアップグレード
function gethugo () {
    wget -q -P tmp/ https://github.com/gohugoio/hugo/releases/download/v"$@"/hugo_extended_"$@"_Linux-64bit.tar.gz
    tar xf tmp/hugo_extended_"$@"_Linux-64bit.tar.gz -C tmp/
    sudo mv -f tmp/hugo /usr/local/bin/
    rm -rf tmp/
    hugo version
}

$@という表記は、与えられたすべての引数を受け取り、関数内のその位置に展開します。上記の関数でHugoバージョン0.57.2をダウンロードするには、gethugo 0.57.2と実行するだけです。

Golang用もあります。

function getgolang () {
    sudo rm -rf /usr/local/go
    wget -q -P tmp/ https://dl.google.com/go/go"$@".linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf tmp/go"$@".linux-amd64.tar.gz
    rm -rf tmp/
    go version
}

あるいは、GitLabのリモートorigin URLを現在のリポジトリに追加する関数はいかがでしょうか。

function glab () {
    git remote set-url origin --add git@gitlab.com:"$@"/"${PWD##*/}".git
    git remote -v
}

glab usernameと実行すれば、GitLab.com上の自分のusernameを使って、現在のGitリポジトリに新しいoriginURLを追加できます。新しいリモートURLへのプッシュは自動的に新しいプライベートなGitLabリポジトリを作成するため、バックアップ作成のための便利なショートカットになります!

Bash関数の可能性は、事実上スクリプティングの可能性によってのみ制限されます。つまり、ほぼ無限です。ターミナルに数行入力する必要がある定型作業があるなら、それはおそらくBash関数で自動化できるはずです!

Bashプロンプト

ディレクトリの内容だけでなく、今いるディレクトリの完全なパスが見えるのも便利です。Bashプロンプトでは、このパスに加えて、現在のGitブランチなどの有用な情報も表示できます。読みやすくするために、プロンプトの各部分に色を定義しましょう。.bashrcでこれを実現する設定例は以下の通りです。

# カラーコードは扱いにくいので、名前を付けておく
txtcyn='\[\e[0;96m\]' # シアン
txtpur='\[\e[0;35m\]' # パープル
txtwht='\[\e[0;37m\]' # ホワイト
txtrst='\[\e[0m\]'    # テキストリセット

# プロンプトのどの部分にどの色を使うか?
pathC="${txtcyn}"
gitC="${txtpur}"
pointerC="${txtwht}"
normalC="${txtrst}"

# ブランチ名を取得して括弧で囲む
gitBranch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

# プロンプトを組み立てる
export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "

結果は次のようになります。

~/github/myrepo (master) $

色に名前を付けておくと、どこで色が始まり、どこで終わり、次の色がどこから始まるのかが一目瞭然です。ターミナルに表示されるプロンプトはexport PS1に続く文字列で定義され、各要素はエスケープシーケンスで設定されます。分解してみましょう。

  • \w: 現在の作業ディレクトリを表示
  • \$(gitBranch): 上で定義したgitBranch関数を呼び出し、現在のGitブランチを表示
  • \$: 一般ユーザーなら「$」を、rootなら「#」を表示

Bashのエスケープシーケンスの一覧を参照すれば、時刻や日付まで含めて、さらに多くの情報を表示できます。Bashプロンプトは高度にカスタマイズ可能で、個性が出る部分でもあります。ぜひ自分好みに設定してみてください。

情報を目立つ位置に配置し、作業効率を高めるためのプロンプト例をいくつか紹介します。

先延ばし防止派に

ユーザー名と、秒まで表示する24時間形式(HH:MM:SS)の現在時刻。

export PS1="${userC}\u ${normalC}at \t >"
user at 09:35:55 >

現在地を常に把握したい人に

別の行にフルパスとユーザー名を表示。

export PS1="${pathC}\w${normalC}\n\u:"
~/github/myrepo
user:

ミニマリストに

export PS1=">"
>

基本的なエスケープシーケンスだけでも、実用的なプロンプトは数多く作れます。Gitブランチの例のように関数をプロンプトに組み込み始めると、構成は一気に複雑になりえます。その程度の複雑さが生産性の向上につながるのか、むしろ妨げになるのかは、あなた自身にしか判断できません!

凝ったデザインのBashプロンプトは、簡単な検索ですぐに見つかるツールやテーマで実現できます。あえてサンプルは載せません。というのも、私と同じようにこういうものに熱中してしまうタイプだと、この記事を読み終える前に数時間溶けてしまうかもしれず、それを良心が許さないからです。?

これで、Bash設定ファイルへの投資時間と得られる利便性の間で、良好なバランスが取れたのではないでしょうか!回復したキーストロークの余裕を、ぜひ有意義なことに使ってください。

  1. Rubyのエイリアス(別名定義)完全ガイド:aliasキーワードとalias_methodの違い

    Rubyでは、既存のメソッドに別名(エイリアス)を付ける方法が2つあります。 alias(キーワード) alias_method(メソッド) どちらも同じ目的で使えますが、挙動が微妙に異なるため、初心者にとって混乱しやすいトピックです。 本記事では、両者の違いを詳しく掘り下げ、しっかりと理解できるように解説していきます。 aliasキーワードとは まずはaliasから見ていきましょう。aliasはRubyのキーワードの一つです(ifやdef、classなどと同じ扱いです)。 基本的な書き方は以下の通りです。 alias print_something puts print_someth

  2. Linuxのwatchコマンドの使い方と実用例をわかりやすく解説

    Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行