Bir kabuğun bildiği tüm komutları listele


32

bashTanınan tüm komutları listeleyecek olan kabuğuma ne olabilir ?

Ayrıca, bu kabuktan farklılık gösterir mi? Yoksa tüm mermilerde tanıdıkları komutların "dizini" var mı?

İkincisi, farklı bir soru, ama bunlardan herhangi birini nasıl geçersiz kılabilirim? Başka bir deyişle viewUbuntu sistemimde var olanı değiştirmek için kendi komutumu nasıl yazabilirim ki bu sadece yükleniyor vim.


5
Lütfen soruları birleştirmeyin. Her birini ayrı bir soru olarak gönderin.
terdon

Yanıtlar:


61

Kullanabilirsinizcompgen

compgen -c # will list all the commands you could run.

Bilginize:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
compgen -cBunun gibi {veya whilekesinlikle konuşma komutları içermeyen şeyler içereceğini unutmayın .
Stéphane Chazelas

13

Bir kabuk dört çeşit komutu bilir.

  • Takma adlar: Bunlar, bazı seçeneklere sahip bir komut için takma adlardır. Kabuğun başlangıç ​​dosyasında ( ~/.bashrcbash için) tanımlanırlar.
  • İşlevler: Bir isim verilen kabuk kod parçacıklarıdır. Diğer adlar gibi, kabuğun başlatma dosyasında tanımlanırlar.
  • Yerleşikler: kabuk, az sayıda yerleşik komutla gelir. Çoğu yerleşik kabuk durumunu cddeğiştirir (geçerli dizini setdeğiştirir, seçenekleri ve konum parametrelerini exportdeğiştirir, ortamı değiştirir,…). Çoğu kabuk, büyük ölçüde aynı yerleşikleri sunar, ancak her kabuk, temel kümeye birkaç uzantıya sahiptir.
  • Dış komutlar: kabuktan bağımsızdırlar. Diğer programlar gibi, kabuk da harici programları çalıştırılabilir arama yolunda arayarak yürütür . PATHOrtam değişkeni programları aramak için, iki nokta üstüste ayrılmış bir listesini içerir.

Aynı isimde birkaç tip komut varsa, yukarıdaki sıradaki ilk eşleşme gerçekleştirilir¹.

Bir adın ne tür bir komuta karşılık geldiğini çalıştırarak görebilirsiniz type some_name.

Takma adı aliasargüman olmadan çalıştırarak takma adları listeleyebilirsiniz . Tüm mermilerde çalışan fonksiyonları veya yerleşikleri listelemenin bir yolu yoktur. Yerleşiklerin listesini kabuğun belgelerinde bulabilirsiniz.

Bash'ta, setyerleşik, değişkenlerin yanı sıra tanımlarıyla işlevleri de listeler. Bash, ksh veya zsh typeset -ffonksiyonlarını tanımlarıyla listeler. Bash'ta, herhangi bir türdeki tüm komut adlarını ile birlikte listeleyebilirsiniz compgen -c. Sen kullanabilirsiniz compgen -A alias, compgen -A builtin compgen -A functionbelirli bir türdeki liste komutlarına. compgenYalnızca bu önekle başlayan komutları listelemek için ek bir dize geçirebilirsiniz .

Zsh olarak, birlikte belirli bir türden mevcut komutları listeleyebilirsiniz echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}ve echo ${(k)commands}(bu sonuncusu listeleri harici komutları için).

Aşağıdaki kabuk-agnostik snippet'i mevcut tüm harici programları listeler:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

Bash: hashed komutlarında bir uç vaka var.

Bash Referans El Kitabı diyor ki:

Dizinlerin $ PATH dizininde tam olarak aranması ancak komutun karma tablosunda bulunmaması durumunda gerçekleştirilir.

Deneyin:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

PATHOrtam değişkeni içermiyor ~/dir-for-wat-command, compgen -cgöstermez wat, ancak çalıştırabilirsiniz wat.

Mevcut bir komutu gölgelendirmek istiyorsanız, takma ad veya işlev tanımlayın .

¹ İstisna: bazı yerleşikler ( özel yerleşikler denir ) bir işlev tarafından gölgelendirilemez - bash ve zsh varsayılan modda bu noktadaki POSIX ile uyumlu değildir.


Başka bir kenar durumu, geçerli dizindeki yürütülebilir dosyaları listelemenin başarısız olacağı $PATHbenzer /bin:/usr/bin:(takip eden :) değerleri içindir .
Stéphane Chazelas

3

Komut listesi iki takımdan oluşur:

  1. Kabuğa yerleşik komutlar
  2. Komutlarınızdaki komutlar PATH

Yerleşikleri değiştiremezsiniz, ancak tam yol adını belirterek kabuğun yerleşik kullanmasını engelleyebilirsiniz /bin/echo.

Gözlerinde farklı komutlar gelince PATH, sen yapabilirsiniz bunu değiştirmek. PATHkomutların aranacağı dizinlerin sütunlarla ayrılmış listesidir. İlk eşleşen dosya "kazanır".

export PATH=~/bin:${PATH}

(Bu sözdizimi, cshonaylanmış kabukları için değil , bildiğim tüm diğerleri için çalışmaz ).

Yani ihracat PATHile ~/binilk giriş varolan geri kalanı tarafından takip olarak PATHgirdileri. Bu yüzden şimdi kabuğunuz sistemdeki directory calledbin in your home directory for a command *first* before checking the standardhaznesini kontrol edecek . Bunun yerine yeni dizini en son kontrol etmesini kolayca yapabilirsiniz:

export PATH=${PATH}:~/bin

PATHGelecekteki oturum açmaları için kalıcı hale getirmek için , bunu bir .profileveya başka bir kabuk rc dosyasına ekleyin .



1

Sekme tuşuna iki kez ve ardından y'ye basarsanız, mevcut kabuğunuzdaki tüm mevcut komutların listesini alırsınız. İkinci soru için takma ad kullanmanız gerektiğini düşünüyorum: kabuk takma adı .


takma ad ile ilgili olarak, sistemin herhangi bir yerinde (örneğin bir kabuk komut dosyasından) çağrıldığında bir komutu geçersiz kılma ve geçersiz kılma ("unaliasing") yöntemi midir?
themirror

1
Hangi kabuğu kullanıyorsunuz? Baslığımdaki tüm komutları listelemek için çift sekmeyi bulamıyorum.
terdon

Ubuntu 13.04'te bash kullanıyorum. Ayrıca bash üzerindeki mevcut tüm komutların listesini almak için kullanılabilecek compgen adında bir komut vardır.
coffeMug

@ terdon Kurulu bash tamamlandı mı?
coffeMug

1
show-all-if-belirsiz kapalı ayarlamak
coffeMug
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.