コマンドの使用とは: `command`?


34

最近、コマンドを見つけました。command手動入力はありませんが、ヘルプは次のように表示されます。

$ 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 -v代替はwhich

どのような議論は、このコマンドによって受け入れられ、どのように/するときに使用しますかcommand

回答:


44

commandご覧のとおり、bash ビルトインです。

seth@host:~$ type command
command is a shell builtin

したがってcommand、シェルbashによって提供されることがわかります。掘りman bash、その使用が何であるかを見ることができます私たち:

(からman bash):

command [-pVv] command [arg ...]
              Run  command  with  args  suppressing  the normal shell function
              lookup. Only builtin commands or commands found in the PATH  are
              executed.   If the -p option is given, the search for command is
              performed using a default value for PATH that is  guaranteed  to
              find  all  of  the  standard  utilities.  If either the -V or -v
              option is supplied, a description of command is printed.  The -v
              option  causes a single word indicating the command or file name
              used to invoke command to be displayed; the -V option produces a
              more  verbose  description.  If the -V or -v option is supplied,
              the exit status is 0 if command was found, and  1  if  not.   If
              neither  option  is  supplied  and  an error occurred or command
              cannot be found, the exit status is 127.   Otherwise,  the  exit
              status of the command builtin is the exit status of command.  

基本的に、command「通常の関数検索」をバイパスするために使用します。たとえば、次の関数があったとしましょう.bashrc

function say_hello() {
   echo 'Hello!'
}

通常、say_helloターミナルbashで実行すると、たとえば、という名前のアプリケーションが見つかる前に、その名前の関数が見つかりsay_helloます。を使用して: .bashrc say_hello

command say_hello  

bashが通常の関数検索をバイパスし、組み込み関数またはに直接移動します$PATH。この関数ルックアップはエイリアス含まれていることに注意してください。を使用commandすると、関数とエイリアスの両方がバイパスされます。

-pオプションが提供されている場合、bashはカスタム$PATHをバイパスし、独自のデフォルトを使用します。

-vまたは-V(の短い説明を印刷bashのフラグ-v長いため、-Vコマンド)。

注:souravcがコメントで指摘したように、シェルの組み込みコマンドに関する情報を見つけるための簡単な方法はここにあります。


1
また見thsi
souravc

@souravcそれは面白いです、私はcommand自分のマシンにマンページがありません。
セス14年

2
試してくださいsudo apt-get install manpages-posix。デフォルトではインストールされません。見てここに
souravc

@souravcとても良い!そのリンクを回答に編集します。
セス14年

1
@ Nori-chan BashはUbuntuのデフォルトのシェルです。入力したコマンドを解釈し、入力した情報を使用して何をどのように実行するかを決定します。Un * xコマンドラインを学習することで、(ある意味)bashを学習しています:)
セス

14

これは、Bashシェルの組み込みコマンドです。

このビルトインで私が見る唯一の利点は、ヘルプテキストの次の文に要約されています。

Can be used to invoke commands on disk when a function with the same name exists

したがって、プログラム(ディスクの一部の保存されたバイナリファイル)を実行し、同じ名前の内部シェル関数が存在する場合、この組み込みを使用してプログラムを呼び出すことができます。

そして、はい、command -vと同じ種類の結果が得られtypeます。

Dashシェルの下にもあります。


1
さらに明示的に追加する価値があるのは、command (name)シェル関数を無視しますが、無視command -v (name)しないことです。command -v (name) >/dev/nullシェルのビルトイン、関数、または外部ユーティリティであるかどうかに関係なく、その名前のコマンドが存在するかどうかを確認するポータブルな方法であると想定されています。
hvd 14

1
、タイプへのposixの代替である-vコマンドなど、stackoverflow.com/questions/762631/...
ハビエル・ロペス・

実際の例では、Android AOSPビルド環境(v4.2.2以降のある時点で)は、ビルドが成功したかどうかとそれがかかった時間に関する情報を吐き出す 'make'という名前のシェル関数を定義します。AOSPビルド環境の他のシェル関数は、command make実際の実際のmakeプログラムを呼び出すために使用します。残念ながら、AOSP環境がmakeプログラムの出力にたわごとを追加し始めたときに壊れた他のシェルスクリプトがあり、その余分な出力が神秘的にどこから来ているのかを把握するのは地獄のようにいらいらしていました。
マイケルバー

6

2つの異なる用途があります。

1つの使用法は、エイリアス関数を無視し、同じ名前のエイリアスまたは関数が存在する場合でも、PATHにある実行可能ファイルを実行することです。

例として、ディレクトリ名にlsa /を追加するエイリアスを使用します。

$ alias ls='ls --classify'
$ ls -d .
./
$ command ls -d .
.

対話型シェルでは、代替の短い構文としてコマンド名の前にバックスラッシュを使用する方が便利な場合があります。

$ \ls -d .
.

もう1つの用途は、オプションを使用してコマンド名が使用されていないときに実行されるコマンド見つけること-vです。これはの最も移植性の高い/ POSIXバリアントのようwhichです。

$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed

4

commandたとえば、特定のコマンドの存在を確認する場合に便利です。whichルックアップにエイリアスを含めるので、ランダムなエイリアスを問題のコマンドと見なしたくないため、この目的には適していません。

つまり、次のようなシェルスクリプトに小さな関数を含めることができます。

exists() {
  command -v "$1" >/dev/null 2>&1
}

そして、次のように、使用可能なコマンド(ここではdialog)をテストします。

if ! exists dialog ; then
   echo "This script requires 'dialog'."
   echo "Install it with 'sudo apt-get install dialog', then try again!"
   exit 1
fi

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.