การใช้คำสั่งคืออะไร: `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เป็นทุบตีbuiltinอย่างที่เราเห็น:

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

ดังนั้นเรารู้ว่าcommandมีให้โดยเปลือกของเราทุบตี เมื่อขุดลงไป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ในทุบตี terminal ของคุณจะพบว่าฟังก์ชั่นที่มีชื่อsay_helloในของคุณ.bashrc ก่อนที่จะพบว่าการพูด, say_helloแอพลิเคชันที่มีชื่อว่า โดยใช้:

command say_hello  

ทำให้ทุบตีบายพาสค้นหาฟังก์ชั่นปกติและตรงไป builtins $PATHหรือของคุณ โปรดทราบว่าการค้นหาฟังก์ชั่นนี้ยังรวมถึงชื่อแทน การใช้commandจะข้ามทั้งฟังก์ชั่นและชื่อแทน

หาก-pตัวเลือกที่มีให้ทุบตีข้ามกำหนดเองของคุณ$PATHและใช้ค่าเริ่มต้นของตัวเอง

-vหรือ-Vธงทุบตีพิมพ์คำอธิบาย (สั้น-v, ยาว-V) ของคำสั่ง

หมายเหตุ: ดังที่ souravc ชี้ให้เห็นในความคิดเห็นวิธีการที่ง่ายขึ้นสำหรับการค้นหาข้อมูลเกี่ยวกับเชลล์บิวด์อินสามารถพบได้ที่นี่: จะทำให้ `คนทำงานได้อย่างไรสำหรับคำสั่งและคำหลักเชลล์บิวด์อิน?


1
นอกจากนี้ยังมองไปที่thsi
souravc

@souravc มันตลกดีฉันไม่มี manpage สำหรับcommandบนเครื่องของฉัน
เซท

2
sudo apt-get install manpages-posixความพยายาม ไม่ได้ติดตั้งเป็นค่าเริ่มต้น ดูที่นี่
souravc

@souravc ดีมาก! ฉันจะแก้ไขลิงก์นั้นเป็นคำตอบ
เซท

1
@ Nori จังทุบตีเป็นค่าเริ่มต้นของ Ubuntu เปลือก มันเป็นสิ่งที่ตีความคำสั่งที่คุณป้อนและตัดสินใจว่าจะทำอย่างไรและจะทำอย่างไรกับข้อมูลที่คุณป้อน โดยการเรียนรู้ Un * x บรรทัดคำสั่งที่คุณมี (ในทาง) การเรียนรู้ทุบตี :)
เซท

14

นี่เป็นคำสั่งในตัวของเชลล์ Bash

ข้อได้เปรียบเดียวที่ฉันเห็นในตัวนี้ถูกสรุปไว้ในประโยคต่อไปนี้ของข้อความช่วยเหลือ:

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

ดังนั้นหากคุณต้องการรันโปรแกรม (ไฟล์ไบนารีที่บันทึกไว้ในดิสก์ของคุณ) และมีฟังก์ชันเชลล์ภายในที่มีชื่อเดียวกันอยู่คุณสามารถเรียกใช้โปรแกรมของคุณได้โดยใช้ตัวนี้

และใช่จะให้ชนิดเดียวกันของผลเป็นcommand -vtype

ฉันพบว่ามันยังอยู่ภายใต้เปลือก Dash


1
สิ่งที่ควรค่าแก่การเพิ่มอย่างชัดเจนคือแม้ว่าจะไม่command (name)สนใจฟังก์ชั่นของเชลล์command -v (name)ก็ตาม command -v (name) >/dev/nullควรเป็นวิธีพกพาในการตรวจสอบว่ามีคำสั่งชื่อนั้นอยู่หรือไม่ไม่ว่าจะเป็นเชลล์บิวด์อินฟังก์ชันหรือยูทิลิตี้ภายนอก
hvd

1
คำสั่ง -v เป็นทางเลือก posix ที่พิมพ์ ฯลฯstackoverflow.com/questions/762631/ …
Javier López

สำหรับตัวอย่างในโลกแห่งความจริงสภาพแวดล้อมการสร้าง Android AOSP (ณ จุดหลัง v4.2.2) จะกำหนดฟังก์ชั่นเชลล์ที่ชื่อว่า 'make' ซึ่งจะกระจายข้อมูลเกี่ยวกับการสร้างสำเร็จหรือไม่และใช้เวลานานแค่ไหน ฟังก์ชั่นเชลล์อื่น ๆ ในสภาพแวดล้อมการสร้าง AOSP ใช้command makeเพื่อเรียกใช้โปรแกรมสร้างที่เกิดขึ้นจริง น่าเสียดายที่ฉันมีเชลล์สคริปต์อื่น ๆ ที่ยากจนเมื่อสภาพแวดล้อม AOSP เริ่มเพิ่มอึกับสิ่งที่makeโปรแกรมส่งออกและมันก็น่ารำคาญเมื่อพบว่าแหล่งที่มานั้นมาจากแหล่งอื่น
Michael Burr

6

มันมีประโยชน์สองอย่าง:

การใช้งานครั้งเดียวคือการละเว้นนามแฝงและฟังก์ชั่นและเรียกใช้ไฟล์ปฏิบัติการที่พบใน PATH แม้ว่าจะมีนามแฝงหรือฟังก์ชั่นที่มีชื่อเดียวกันอยู่ก็ตาม

ตัวอย่างเช่นฉันจะใช้นามแฝงสำหรับlsที่ต่อท้าย/ชื่อไดเรกทอรี:

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

ในเชลล์แบบโต้ตอบอาจสะดวกกว่าในการใช้แบ็กสแลชก่อนชื่อคำสั่งเป็นทางเลือกซึ่งเป็นไวยากรณ์ที่สั้นกว่า:

$ \ls -d .
.

การใช้งานอื่น ๆ คือการหาคำสั่ง-vที่จะทำงานเมื่อชื่อคำสั่งไม่ได้ถูกใช้โดยใช้ตัวเลือก มันน่าจะเป็นแบบพกพามากที่สุด / 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.