Việc sử dụng lệnh là gì: `lệnh`?


34

Gần đây tôi tìm thấy lệnh: commandkhông có mục nhập thủ công nhưng giúp hiển thị như sau:

$ 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 -vthay thế của which?

Những đối số nào được chấp nhận bởi lệnh này và làm thế nào / khi nào sử dụng command?

Câu trả lời:


44

commandlà một bash dựng sẵn như chúng ta có thể thấy:

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

Vì vậy, chúng tôi biết commandđược cung cấp bởi vỏ của chúng tôi, bash. Đi sâu vào man bashchúng ta có thể thấy công dụng của nó là gì:

(từ 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.  

Về cơ bản, bạn sẽ sử dụng commandđể bỏ qua "tra cứu chức năng bình thường". Ví dụ: giả sử bạn có một chức năng trong .bashrc:

function say_hello() {
   echo 'Hello!'
}

Thông thường, khi bạn chạy say_hellotrong bash terminal, bạn sẽ tìm thấy hàm có tên say_hellotrong .bashrc trước khi tìm thấy ứng dụng có tên say_hello. Sử dụng:

command say_hello  

làm cho bash bỏ qua chức năng tra cứu chức năng bình thường của nó và đi thẳng đến nội dung hoặc của bạn $PATH. Lưu ý rằng tra cứu chức năng này cũng bao gồm các bí danh. Sử dụng commandsẽ bỏ qua cả chức năng và bí danh.

Nếu -ptùy chọn được cung cấp, bash bỏ qua tùy chỉnh của bạn $PATHvà sử dụng mặc định của riêng nó.

Các -vhoặc -Vcờ bash in một mô tả (viết tắt của -v, dài cho -V) của lệnh.

Lưu ý: Như souravc đã chỉ ra trong các nhận xét, một phương pháp dễ dàng hơn để tìm thông tin về các nội dung shell có thể được tìm thấy ở đây: Làm thế nào để làm cho `man` hoạt động cho các lệnh và từ khóa dựng sẵn shell?


1
Ngoài ra nhìn vào thsi
souravc

@souravc Thật buồn cười, tôi không có trang nào cho commandmáy của mình.
Seth

2
thử sudo apt-get install manpages-posix. Nó không được cài đặt theo mặc định. nhìn vào đây
souravc

@souravc Rất tốt! Tôi sẽ chỉnh sửa liên kết đó vào câu trả lời.
Seth

1
@ Nori-chan Bashvỏ mặc định của Ubuntu . Đó là điều diễn giải các lệnh bạn nhập và quyết định phải làm gì và làm như thế nào với thông tin bạn nhập. Bằng cách học dòng lệnh Un * x, bạn sẽ (học theo cách nào đó) học bash :)
Seth

14

Đây là lệnh tích hợp của shell Bash.

Ưu điểm duy nhất tôi thấy với phần dựng sẵn này được tóm tắt trong câu sau của văn bản trợ giúp:

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

Vì vậy, nếu bạn muốn thực thi một chương trình (một tệp nhị phân được lưu trong một số đĩa của bạn) và một hàm shell bên trong cùng tên tồn tại, thì bạn có thể gọi chương trình của mình bằng cách sử dụng tích hợp này.

Và có, command -vsẽ cho kết quả tương tự như type.

Tôi cũng đã tìm thấy nó dưới vỏ Dash.


1
Điều đáng để thêm rõ ràng hơn là mặc dù bỏ qua command (name)các hàm shell, command -v (name)nhưng không. command -v (name) >/dev/nullđược coi là cách di động để kiểm tra xem lệnh có tên đó tồn tại hay không, bất kể đó là phần mềm dựng sẵn, hàm hoặc tiện ích bên ngoài.
hvd

1
lệnh -v là thay thế posix mà, loại, v.v., stackoverflow.com/questions/762631/ Kẻ
Javier López

Đối với một ví dụ trong thế giới thực, môi trường xây dựng AOSP của Android (tại một thời điểm nào đó sau phiên bản 4.2.2) xác định hàm shell có tên 'make' sẽ tiết lộ thông tin về việc liệu bản dựng có thành công hay không và mất bao lâu. Các hàm shell khác trong môi trường xây dựng AOSP sử dụng command makeđể gọi chương trình tạo thực tế. Thật không may, tôi có các tập lệnh shell khác bị hỏng khi môi trường AOSP bắt đầu thêm shit vào những gì makechương trình đưa ra và thật khó chịu khi địa ngục tìm ra nơi mà sản lượng bổ sung đó đến từ đâu.
Michael Burr

6

Nó có hai cách sử dụng khác nhau:

Một cách sử dụng là bỏ qua các bí danh và các hàm và chạy tệp thực thi được tìm thấy trong PATH, ngay cả khi tồn tại một bí danh hoặc một hàm có cùng tên.

Ví dụ: tôi sẽ sử dụng một bí danh để lsthêm /tên thư mục vào:

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

Trong một vỏ tương tác, có thể thuận tiện hơn khi sử dụng dấu gạch chéo ngược trước tên lệnh thay thế, cú pháp ngắn hơn:

$ \ls -d .
.

Cách sử dụng khác là tìm lệnh sẽ được chạy khi tên lệnh không được sử dụng bằng cách sử dụng tùy chọn -v. Nó dường như là biến thể di động / POSIX nhất của which.

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

4

commandlà hữu ích, ví dụ, nếu bạn muốn kiểm tra sự tồn tại của một lệnh cụ thể. whichbao gồm các bí danh để tra cứu vì vậy nó không phù hợp cho mục đích này vì bạn không muốn một bí danh ngẫu nhiên được coi là lệnh trong câu hỏi.

Nói cách khác, bạn có thể có một hàm nhỏ trong tập lệnh shell như thế này:

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

Và sau đó kiểm tra một lệnh có sẵn (ở đây, dialog), như vậy:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.