bash

提供: MacWiki
2017年11月22日 (水) 21:09時点における (トーク | 投稿記録)による版

移動: 案内検索

Mac OS X の標準シェル

bash とは?

Bourne Shell の系譜を引く高機能シェルです。 GNU の配布物であるため、多くの Linux ディストリビューションで 標準シェルとして使われています。詳しくは Wikipedia:Bash などを参照してください。 また、そもそもシェルとは何かということについては、 UNIX入門のシェルについての項を参照してください。

Mac OS X でも Version 10.3 (Panther) から bash が標準シェルに採用されています。

入門記事

文法

変数

変数は、宣言なしに使うことができます。参照するときは $ をつけます。

a=1
echo $a
==> "1"

引数

以下の特殊変数を使うと、スクリプトの引数にアクセスできます。

$* 引数全部
$0 実行スクリプト名
$1 1つめの引数
$# 引数の数

条件文

条件文は、if で始まって fi で閉じます。[ ... ] で囲っている部分が条件式です。

if [ (条件) ]; then
        ...
fi

例)

if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

さらに条件分岐する場合は、elif (elsif ではないことに注意) や else を使います。

if [ (条件) ]; then
        ...
elif [ (条件) ]; then
        ...
else
        ...
fi


ループ

(未稿)

カスタマイズ変数

(質問)tcsh の unset autologout に相当する変数ってありましたっけ? - ぜ

bash_completion

bashには、シェルの補完の動作をプログラムを書いて自由に拡張できる、 プログラマブル補完機能が備わっています。 このような補完の定義を自分で書くのも良いですが、 次のサイトで配布されている設定パッケージ(bash_completion)を使うと便利です。 2009年から、新しいメンテナーに開発が引き継がれています。

bash_completion ファイル、および bash_completion.d ディレクトリを適切な場所に設置したのち、 .bashrc あるいは .bash_profile に次のように書いて、設定ファイルを読みこみます。

[ -n "${BASH_COMPLETION}" ] || \
    export BASH_COMPLETION="${HOME}/docoka/bash_completion"
[ -n "${BASH_COMPLETION_DIR}" ] || \
    export BASH_COMPLETION_DIR="${HOME}/docoka/bash_completion.d"
. ~/docoka/bash_completion

bash_completionをシステムにインストール(/etc/bash_completion)した場合は、 1〜4行目の BASH_COMPLETION、BASH_COMPLETION_DIR の設定は不要です。

  • プログラマブル補完機能で open コマンド(open -a <application_name> <filename>)の <application_name> 部分も補完できたらいいですね。
    • ↓吉武氏に補完ファイルを頂きました。中身を整理して本家にフィードバックできれば良いのですが... --
_mac_applications() {
  local IFS=$'\t\n'
  COMPREPLY=( \
    $( compgen -W \
      '$( mdfind -onlyin /Applications -onlyin /Developer'\
'           -onlyin $HOME/Applications -onlyin $HOME/Desktop'\
'           "kMDItemContentType == '"'com.apple.application-*'"\
'"        | perl -p -e "s|^.*/||; s|\\.app||; s| |\\\\ |g;" )' -- $cur ) )
}

# dfind -onlyin /Applications "kMDItemContentType==com.apple.application-*" | sed -e 's/.*\///; s/ /\\\\ /'

_open() {
  local cur prev prefix temp

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  prev=${COMP_WORDS[COMP_CWORD-1]}

  if [ $COMP_CWORD -eq 2 ] && [[ "$prev" == -a ]]; then
    _mac_applications
    return 0
  elif [[ "$cur" != -* ]]; then
    _filedir
    return 0
  fi

  # complete using basic options
  COMPREPLY=( $( compgen -W '-a -b -e -f -t -foo" "bar' -- $cur ) )

  return 0
}

complete -F _open open

関数を定義する

自作のエイリアスコマンドで引数を使いたいときは、 alias ...=... の代わりに function を定義します。 引数は、それぞれ $@, $1, $2 のように記述します。

function cd () { command cd $@ && pwd && ls -aF ; }

関連書籍

  • ニューハム,キャメロン (著)『入門bash 第3版』(オライリー・ジャパン, 2005/10/26, 2940円)