Apa gunanya perintah: `command`?

34

Baru-baru ini saya menemukan perintah: commandyang tidak memiliki entri manual tetapi membantu menampilkan sebagai berikut:

$ 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.

Apakah command -valternatif which?

Argumen apa yang diterima oleh perintah ini dan bagaimana / kapan menggunakannya command?

Pandya
sumber

Jawaban:

44

commandadalah bash builtin seperti yang bisa kita lihat:

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

Jadi kita tahu commanddisediakan oleh shell kita, bash. Menggali man bashkita dapat melihat apa gunanya:

(dari 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.  

Pada dasarnya Anda akan menggunakan commanduntuk memotong "pencarian fungsi normal". Misalnya, Anda memiliki fungsi di .bashrc:

function say_hello() {
   echo 'Hello!'
}

Biasanya, ketika Anda menjalankan say_hellobash terminal Anda akan menemukan fungsi yang dinamai say_hellodi Anda .bashrc sebelum ditemukan, katakanlah, aplikasi bernama say_hello. Menggunakan:

command say_hello  

membuat bash memintas pencarian fungsi normalnya dan langsung menuju bawaan atau Anda $PATH. Perhatikan bahwa pencarian fungsi ini juga termasuk alias. Menggunakan commandakan memintas kedua fungsi dan alias.

Jika -popsi ini disediakan, bash mem-bypass custom Anda $PATHdan menggunakan default sendiri.

The -vatau -Vbendera pesta mencetak deskripsi (singkatan -v, panjang untuk -V) dari perintah.

Catatan: Seperti yang ditunjukkan oleh souravc dalam komentar, metode yang lebih mudah untuk menemukan informasi tentang shell builtin dapat ditemukan di sini: Bagaimana membuat `man` berfungsi untuk perintah dan kata kunci builtin shell?

Seth
sumber
1
Lihat juga ini
souravc
@souravc Itu lucu, saya tidak memiliki halaman manual commanddi komputer saya.
Seth
2
coba sudo apt-get install manpages-posix. Ini tidak diinstal secara default. lihat di sini
souravc
@souravc Sangat bagus! Saya akan mengedit tautan itu menjadi jawabannya.
Seth
1
@ Nori-chan Bash adalah shell default Ubuntu . Ini adalah hal yang menafsirkan perintah yang Anda masukkan dan memutuskan apa yang harus dilakukan dan bagaimana melakukannya dengan informasi yang Anda masukkan. Dengan mempelajari baris perintah Un * x, Anda (sedang belajar) bash :)
Seth
14

Ini adalah perintah bawaan dari Bash shell.

Satu-satunya keuntungan yang saya lihat dengan bawaan ini dirangkum dalam kalimat berikut dari teks bantuan:

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

Jadi jika Anda ingin menjalankan suatu program (file biner yang disimpan dari beberapa disk Anda), dan fungsi shell internal dengan nama yang sama ada, maka Anda dapat menjalankan program Anda menggunakan built-in ini.

Dan ya, command -vakan memberikan hasil yang sama dengan type.

Saya telah menemukannya juga di bawah shell Dash.

Benoit
sumber
1
Apa yang layak ditambahkan secara lebih eksplisit adalah bahwa meskipun command (name)mengabaikan fungsi shell, command -v (name)tidak. command -v (name) >/dev/nullseharusnya menjadi cara portabel untuk memeriksa apakah perintah dengan nama itu ada, terlepas dari apakah itu shell builtin, fungsi, atau utilitas eksternal.
hvd
1
command -v adalah alternatif posix yang, ketik, dll, stackoverflow.com/questions/762631/…
Javier López
Sebagai contoh dunia nyata, lingkungan build Android AOSP (pada beberapa titik setelah v4.2.2) mendefinisikan fungsi shell bernama 'make' yang akan memuntahkan informasi tentang apakah build berhasil atau tidak dan berapa lama waktu yang dibutuhkan. Fungsi shell lain di lingkungan build AOSP digunakan command makeuntuk menjalankan program make aktual-faktual. Sayangnya, saya memiliki skrip shell lain yang rusak ketika lingkungan AOSP mulai menambahkan apa-apa untuk makeoutput program dan itu menjengkelkan sekali mencari tahu di mana output tambahan itu secara misterius berasal.
Michael Burr
6

Ini memiliki dua kegunaan yang berbeda:

Satu gunanya adalah untuk mengabaikan alias dan fungsi , dan menjalankan file yang dapat dieksekusi yang ditemukan di PATH, bahkan ketika alias atau fungsi dengan nama yang sama ada.

Sebagai contoh, saya akan menggunakan alias untuk lsyang menambahkan /ke nama direktori:

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

Dalam shell interaktif, mungkin lebih nyaman menggunakan backslash sebelum nama perintah sebagai alternatif, sintaksis yang lebih pendek:

$ \ls -d .
.

Penggunaan lainnya adalah menemukan perintah yang akan dijalankan ketika nama perintah tidak digunakan dengan menggunakan opsi -v. Tampaknya menjadi varian paling portabel / POSIX dari which.

$ command -v ls
alias ls='ls --classify'
$ command -v sed
/bin/sed
Volker Siegel
sumber
4

commandberguna, misalnya, jika Anda ingin memeriksa keberadaan perintah tertentu. whichmenyertakan alias ke dalam pencarian sehingga tidak cocok untuk tujuan ini karena Anda tidak ingin alias acak dianggap sebagai perintah yang dipermasalahkan.

Dengan kata lain, Anda dapat memiliki fungsi kecil di skrip shell seperti ini:

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

Dan kemudian uji untuk perintah yang tersedia (di sini, dialog), seperti:

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