Komutun kullanımı: `command`?


34

Son zamanlarda komutu buldum: commandmanuel giriş içermeyen ancak yardım aşağıdaki gibidir:

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

Is command -valternatif olduğunu which?

Bu komut hangi argümanları kabul eder ve nasıl / ne zaman kullanılır command?

Yanıtlar:


44

commandgördüğümüz gibi bir bash yerleşimidir :

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

Yani commandkabuğumuz tarafından sağlanan biliyoruz , bash. Kazmak man bashonun kullanımının ne olduğunu görebiliriz:

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

Temelde command"normal işlev aramasını" atlamak için kullanırsınız . Örneğin, şöyle bir işleviniz olduğunu söyleyin .bashrc:

function say_hello() {
   echo 'Hello!'
}

Çalıştırdığınızda Normalde say_helloterminal bash isimli fonksiyonu bulur say_helloGözlerinde farklı .bashrc önce onu diyelim bulundu adında bir uygulama say_hello. Kullanımı:

command say_hello  

bash işlevini normal işlev aramasını atlatır ve doğruca yerleşiklere ya da sizin konumunuza gider $PATH. Bu işlev aramasının ayrıca takma adları da içerdiğini unutmayın . Kullanmak commandhem fonksiyonları hem de takma adları atlayacaktır.

Eğer -pseçenek bash ise, özelinizi atlar $PATHve kendi varsayılanını kullanır.

-vVeya -V(kısaltması açıklamasını yazdırır bash bayraklar -vuzun süre, -Vkomuta).

Not: souravc'ın yorumlarda işaret ettiği gibi, kabuk yerleşikleri hakkında bilgi bulmak için daha kolay bir yöntem burada bulunabilir: “insan”, kabuk yerleşik komutları ve anahtar sözcükleri için nasıl çalışır?


1
Ayrıca bakmak Thsi
souravc

@ souravc Çok komik, makinemde manpage yok command.
Seth

2
dene sudo apt-get install manpages-posix. Varsayılan olarak yüklenmez. buraya
souravc

@souravc Çok iyi! Cevabı bu bağlantıyı düzenleyeceğim.
Seth

1
@ Nori-chan Bash , Ubuntu'nun varsayılan kabuğudur . Girdiğiniz komutları yorumlayan ve ne yapacağınıza ve girdiğiniz bilgilerle nasıl yapacağınıza karar veren şeydir. Un * x komut satırını öğrenerek (bir şekilde) bash öğreniyorsunuz :)
Seth

14

Bu, Bash kabuğunun yerleşik emridir.

Bu yerleşik uygulamada gördüğüm tek avantaj, yardım metninin şu cümlesinde özetlenmiştir:

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

Bu nedenle, bir program yürütmek istiyorsanız (bazı disklerinizden kaydedilmiş bir ikili dosya) ve aynı adda bir iç kabuk işlevi varsa, o zaman bu yerleşik programı kullanarak programınızı çağırabilirsiniz.

Ve evet, command -vaynı sonuç verecek type.

Dash kabuğunun altında da buldum.


1
Daha açık bir şekilde eklemeye değer olan şey, command (name)kabuk işlevlerini görmezden gelmesine rağmen command -v (name), değil. command -v (name) >/dev/nullBir kabuk yerleşik, işlev veya harici bir yardımcı program olup olmadığına bakılmaksızın, bu ada sahip olan komutun var olup olmadığını kontrol etmenin taşınabilir bir yolu olduğu varsayılır.
HVD

1
Komut -v için POSIX alternatif, türü, vb olduğunu stackoverflow.com/questions/762631/...
Javier López

Gerçek dünyadaki bir örnek için, Android AOSP derleme ortamı (v4.2.2'den sonra bir noktada) bir derlemenin başarılı olup olmadığı ve ne kadar sürdüğü hakkında bilgi veren “make” adlı bir kabuk işlevi tanımlar. AOSP derleme ortamındaki diğer kabuk işlevleri command make, gerçek-temelli make programını çağırmak için kullanılır . Ne yazık ki, AOSP ortamı makeprogramın çıktısı üzerine bir bok eklemeye başladığında ve bu ekstra çıkışın gizemli bir şekilde nereden geldiğini bulmak cehennem gibi sinir bozucu hale geldiğinde kırılan başka kabuk komutları var .
Michael Burr

6

İki farklı kullanım alanı vardır:

Bir kullanımı görmezden gelmektir takma adları ve işlevleri ve çalıştırmak çalıştırılabilir dosya aynı adda bir takma ad veya işlev olsa bile PATH'ta bulunan .

Örneğin, bunun için lsbir /dizin ismini ekleyen bir takma ad kullanacağım :

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

Etkileşimli bir kabukta, komut adından önce alternatif, daha kısa sözdizimi olarak ters eğik çizgi kullanmak daha uygun olabilir:

$ \ls -d .
.

Diğer kullanım, komut adı seçeneği kullanılarak kullanılmadığında çalıştırılacak komutu bulmaktır-v . En taşınabilir / POSIX değişkeni gibi görünüyor which.

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

4

commandÖrneğin, belirli bir komutun varlığını kontrol etmek istiyorsanız kullanışlıdır. whicharamaya takma adları içerir, bu nedenle bu amaç için uygun değildir, çünkü söz konusu komut olarak rastgele bir takma ad olmasını istemezsiniz.

Başka bir deyişle, şöyle bir kabuk betiğinde küçük bir işleve sahip olabilirsiniz:

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

Ve sonra, uygun bir komutu (burada dialog) sınayın :

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.