それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

コマンドが存在するか調査するコマンド、その名もcommand

コマンド存在スルか調査するコマンドに command が使えます。

$ command -v ls ; echo $?
alias ls='ls --color=auto'
0

シェルの実行結果は 1/0 で戻されています。

echo $? は直前のシェルの実行結果$? を出力しています。正常終了なら0 異常終了なら $? > 0 が返されます。

あるとき

$ command -v ls ; echo $?
alias ls='ls --color=auto'
0

ないとき

command -v lsaaa > /dev/null  ; echo $?
1

command コマンドとは?

commandコマンド はその名前の通りコマンドを実行するプログラムでもあります。

$ command php -v
PHP 7.4.9 (cli) (built: Aug  7 2020 14:55:48) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies

マニュアルにもある通り、通常は type を使います。

ヘルプには、次のように書いてあります。

-v コマンドの詳細をプリントする、これは 組み込みの type コマンドと同じ機能です。

なので、通常は type を使えばいいと思います。

type と command の違い

type は STDERRに出力されます。

$ type lsaaa
-bash: type: lsaaa: not found

command コマンドは、何も出ません

$ command -v  lsaaa
$

bashrc などに書くときに、シェルのリダイレクトの書き方に差が出ます。

type では stderr を消さなくちゃいけないのに対し、command コマンドを使うなら、リダイレクトは1つで済みます。

command -v  lsaaa > /dev/null    && echo exists
type lsaaa > /dev/null  2>/dev/null  && echo exists

マニュアル

help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.

    Options:
      -p    use a default value for PATH that is guaranteed to find all of
            the standard utilities
      -v    print a description of COMMAND similar to the `type' builtin
      -V    print a more verbose description of each COMMAND

    Exit Status:
    Returns exit status of COMMAND, or failure if COMMAND is not found.

検索エンジンの最適化による 困った問題

commandコマンド はその名前の通りコマンドを実行するプログラムでもあります。 しかし、その名前が「あまりに汎用的」な名前であるために、検索でキーワード無視されたり、インデックスの結果をうまく取り扱ってもらえません。

つまり、とっても検索をしにくい名前なんですね。