コンテンツにスキップ
PR

Bashとは

Linux/Unixのシェルで、コマンド実行や運用自動化に使われる。

Linux運用自動化CIログ処理

Bashは、Linux運用や自動化で候補になります。初学者から運用者までで、シェルスクリプト・インタプリタという特徴があります。

項目内容
主な用途Linux運用、自動化、CI、ログ処理
シェルスクリプト
実行方式インタプリタ
学習難易度初学者から運用者まで
パッケージ管理OSパッケージ
公式サイトhttps://www.gnu.org/software/bash/
公式ドキュメントhttps://www.gnu.org/software/bash/manual/
公式更新源https://savannah.gnu.org/news/?group=bash
Terminal window
find /var/log -name "*.log" -mtime -7 -print
  • Linux運用
  • 自動化
  • CI
  • ログ処理

このページへ検索から来た人は、まず「これは何の記法なのか」「今も実用されるのか」「どの資料を確認すればよいのか」を知りたいはずです。理解の入口になる情報を次のように整理します。

観点内容
種別シェル / スクリプト言語
概要GNU Bourne Again Shell。Unix/Linux運用、自動化、シェルスクリプトに使われる。
読み始める順番公式サイト、仕様、実装例、既存資産の順に見ると判断しやすい

読むときは、現在の実用言語なのか、過去の資産を読むための言語なのか、特定製品のためのDSLなのかを分けると判断しやすくなります。

追加調査で押さえる実務ポイント

Bashは、GNU Projectが開発するUnix shell兼command languageです。interactive terminalでcommandを実行する用途と、text fileを非対話shellで順番に実行するscript用途を持ちます。一般的なapplication languageとは異なり、process、file descriptor、pipeline、environment variable、exit statusを操作することが中心です。短い運用automationに向きますが、複雑なdata構造や大規模applicationには別言語を検討します。

基本情報

項目内容
正式名GNU Bash
種別shell / command language
source.shが一般的
runtimebash process
typingstring中心、integer属性あり
packageOS package
用途CLI、automation
licenseGPL

Shellの処理

  1. inputを読む。
  2. tokenとoperatorをparseする。
  3. alias・parameter・command substitutionを展開する。
  4. redirectionを設定する。
  5. commandを探す。
  6. builtinまたはexternal processを実行する。
  7. exit statusを返す。

最小例

#!/usr/bin/env bash
set -euo pipefail

for file in "$@"; do
  printf '%s
' "$file"
done

入力はcommand line argument、出力は各argumentです。

Quote

書き方意味
"$var"word splittingとglobを抑制
'$var'literal
$var通常は避ける
"$(cmd)"command substitution
${var:-default}default value

Pipeline

producer | filter | consumer

各commandは別processになり得ます。pipefailを使わない場合、pipeline全体のstatusは通常最後のcommandで決まります。

向く用途

  • system administration
  • CI glue
  • file operation
  • process起動
  • package installation
  • log filter
  • deployment entrypoint

向かない用途

  • large business logic
  • complex JSON transformation
  • cross-platform GUI
  • high-performance computation
  • long-lived service
  • rich type safety

POSIX shとの違い

Bash array、[[ ... ]]、process substitution、source等はPOSIX shで動かない場合があります。portable scriptなら#!/bin/shとPOSIX syntaxを使います。

Security

  • variableをquoteする
  • evalを避ける
  • untrusted filenameをoption扱いさせない
  • temporary fileにmktemp
  • secretをcommand lineへ出さない
  • curl | bashを避ける
  • shellcheckを使う
  • executable pathを固定する

Error handling

set -eは万能ではありません。conditional、subshell、pipelineで挙動が変わるため、重要commandは明示的にstatusを確認します。

次に読む

参考リンク