拡張 POSIX シェルスクリプト Advent Calendar 2013、17日目の記事です。 時間がないのでやっつけです。間違いがあったらすみません…。
今日はシェルから起動するコマンドが何者かを知る方法と使い分ける方法を紹介します。
コマンドの種類
シェルのコマンドラインから起動されるコマンドの種類として以下の 4つがあります。
(for
などの制御構文は除く)
- シェルのコマンドエイリアス
- シェルの関数
- シェルの組込みコマンド
- 外部のコマンド
ほかにもあったっけ? いまいち自信なし。 エイリアスがコマンドかどうかはさておく。
コマンド種別の判定方法
シェルの種類に依って色々な判定方法があるのですが、
一番ポータブルなのは組込みコマンド type
を利用する方法です
旧来の sh でも使えます。
$ type コマンド名
bash での type
コマンドの出力例:
$ alias aliasname='echo foo'
$ type aliasname
aliasname は `echo foo' のエイリアスです
$ function functionname { echo foo; }
$ type functionname
functionname は関数です
functionname ()
{
echo foo
}
$ type type
type はシェル組み込み関数です
$ type ls
ls はハッシュされています (/bin/ls)
$ type for
for はシェルの予約語です
bash の type
はシェル関数の内容も表示してくれますが、
ksh, zsh では 関数名 is a shell function
とだけ表示します。
関数の内容を表示するには typeset -f 関数名
を実行します。
(bash でも使用可能)
同名のコマンドが存在する場合の優先順位
各コマンド種類に同名のものが存在する場合は、 エイリアス、関数、組込みコマンド、外部コマンドの順位でコマンドが決まります。
以下は zsh での例です。
(disable true
は組込みコマンド true
の無効化、enable true
は有効化をしています)
$ zsh
% disable true
% type true
true is /bin/true
% enable true
% type true
true is a shell builtin
% function true { /bin/true; }
% type true
true is a shell function
% alias true='/bin/true'
% type true
true is an alias for /bin/true
% exit
コマンド種別を使い分ける方法
外部コマンドを明示的に起動するには、
組込みコマンド command
に外部コマンド名を指定します。
$ command コマンド名 [引数]...
bash や ksh
であれば、コマンドにパス名を含めることでも外部コマンドの起動になります。
しかし zsh はエイリアス名や関数名にパス区切り文字 /
を含めることができるため、確実ではありません。
command
コマンドの利用を推奨します。
組込みコマンドを明示的に起動するには、
組込みコマンド builtin
に組込みコマンド名を指定します。
$ builtin コマンド名 [引数]...
シェル関数を明示的に起動する方法は…わかりません。あったら教えてください。
シェル関数より優先される同名のコマンドエイリアスを避ける方法ならあります。
コマンド名の先頭に \
を付けてエスケープするか、
コマンド名をクォートすればエイリアス展開はされません。
$ alias foo='echo foo-alias'
$ function foo { echo foo-function; }
$ foo
foo-alias
$ \foo
foo-function
$ 'foo'
foo-function
$ "foo"
foo-function
ところで、12月25日はクリスマスな上に、
OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
っ http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority
逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!
私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/
よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。
- Ansible Advent Calendar 2023
- シェル芸 Advent Calendar 2023
- 闇の魔術に対する防衛術 Advent Calendar 2023
- Ansible Advent Calendar 2023
- Ansible Advent Calendar 2020
- DNS温泉 Advent Calendar 2019
- OSSTech Advent Calendar 2019
- Ansible Advent Calendar 2018
- OSSTech Advent Calendar 2018
- Debian/Ubuntu Advent Calendar 2017
- Linux Advent Calendar 2017
- Shell Script Advent Calendar 2017
- Shell Script Advent Calendar 2016
- OpenLDAP と仲間たち Advent Calendar 2015
- Postfix Advent Calendar 2014
- 拡張 POSIX シェルスクリプト Advent Calendar 2013