Daftar semua perintah yang diketahui shell

32

Apa yang bisa saya ketik di shell saya (yang kebetulan bash) yang akan mendaftar semua perintah yang dikenali?

Juga, apakah ini berbeda dengan shell? Atau apakah semua shell hanya memiliki "direktori" perintah yang mereka kenali?

Kedua, pertanyaan yang berbeda, tetapi bagaimana saya bisa mengesampingkan semua itu? Dengan kata lain bagaimana saya bisa menulis viewperintah saya sendiri untuk menggantikan yang ada di sistem Ubuntu saya, yang tampaknya hanya memuat vim.

kaca
sumber
5
Tolong jangan gabungkan pertanyaan. Posting masing-masing sebagai pertanyaan terpisah.
terdon
Hampir duplikat dari unix.stackexchange.com/q/63073/135943 (saya telah ditautkan di kedua arah.)
Wildcard

Jawaban:

61

Anda dapat gunakancompgen

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

FYI:

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.
Rahul Patil
sumber
4
Catatan yang compgen -cakan mencakup hal-hal seperti {atau whileyang bukan perintah yang sepenuhnya berbicara.
Stéphane Chazelas
13

Shell tahu empat jenis perintah.

  • Alias: ini adalah nama panggilan untuk suatu perintah dengan beberapa opsi. Mereka didefinisikan dalam file inisialisasi shell ( ~/.bashrcuntuk bash).
  • Fungsi: mereka adalah potongan kode shell yang diberi nama. Seperti alias, mereka didefinisikan dalam file inisialisasi shell.
  • Builtins: shell dilengkapi dengan sejumlah kecil perintah built-in. Kebanyakan bawaan memanipulasi keadaan shell ( cdmengubah direktori saat ini, setmengubah opsi dan parameter posisi, exportmengubah lingkungan, ...). Sebagian besar shell menawarkan builtin yang sama, tetapi setiap shell memiliki beberapa ekstensi untuk set dasar.
  • Perintah eksternal: mereka tidak tergantung pada shell. Seperti program lain, shell mengeksekusi program eksternal dengan mencari mereka di jalur pencarian yang dapat dieksekusi . The PATHvariabel lingkungan berisi daftar dipisahkan oleh titik dua direktori untuk mencari program.

Jika ada perintah dari beberapa jenis dengan nama yang sama, pertandingan pertama dalam urutan di atas dijalankan¹.

Anda dapat melihat jenis perintah yang sesuai dengan nama dengan menjalankan type some_name.

Anda dapat mendaftar alias dengan menjalankan aliasbawaan tanpa argumen. Tidak ada cara untuk membuat daftar fungsi atau bawaan yang bekerja di semua shell. Anda dapat menemukan daftar bawaan dalam dokumentasi shell.

Dalam bash, setbuiltin mendaftar fungsi dengan definisi dan variabelnya. Dalam bash, ksh atau zsh, typeset -fdaftar fungsi dengan definisinya. Di bash, Anda dapat mendaftar semua nama perintah dengan jenis apa pun compgen -c. Anda dapat menggunakan compgen -A alias, compgen -A builtin compgen -A functionuntuk mendaftar perintah dari jenis tertentu. Anda bisa meneruskan string tambahan compgenke daftar hanya perintah yang dimulai dengan awalan itu.

Dalam zsh, Anda bisa daftar perintah yang tersedia saat ini dari jenis tertentu dengan echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}dan echo ${(k)commands}(bahwa salah satu daftar terakhir perintah eksternal saja).

Cuplikan agnostik shell berikut mencantumkan semua program eksternal yang tersedia:

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

Ada kasus tepi di Bash: perintah hash.

Manual Referensi Bash mengatakan:

Pencarian penuh direktori di $ PATH dilakukan hanya jika perintah tidak ditemukan di tabel hash

Mencoba:

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

The PATHvariabel lingkungan tidak mengandung ~/dir-for-wat-command, compgen -ctidak menunjukkan wat, tapi Anda dapat menjalankan wat.

Jika Anda ingin membayangi perintah yang ada, tentukan alias atau fungsi .

¹ Pengecualian: beberapa bawaan (disebut bawaan khusus ) tidak dapat dibayangi oleh suatu fungsi - bash dan zsh tidak mematuhi POSIX pada titik itu dalam mode standarnya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Kasus tepi lain adalah untuk nilai $PATHlike /bin:/usr/bin:(trailing :), di mana ia akan gagal untuk membuat daftar file yang dapat dieksekusi di direktori saat ini.
Stéphane Chazelas
3

Daftar perintah terdiri dari dua set:

  1. Perintah yang ada di dalam shell
  2. Perintah di PATH

Anda tidak dapat mengubah built-in, tetapi Anda dapat menjaga shell dari menggunakan built-in dengan menentukan seperti pathname penuh /bin/echo.

Adapun perintah di Anda PATH, Anda bisa mengubahnya. PATHadalah daftar direktori yang dipisahkan oleh titik dua untuk mencari perintah. File yang cocok pertama kali ditemukan "menang".

export PATH=~/bin:${PATH}

(Sintaks ini tidak bekerja untuk cshshell yang diarsipkan, tetapi semua yang saya tahu).

Itu ekspor PATHdengan ~/binsebagai entri pertama diikuti oleh sisa PATHentri yang ada . Jadi sekarang shell Anda akan memeriksa directory calledbin in your home directory for a command *first* before checking the standardPATH` sistem yang diatur. Anda dapat dengan mudah membuatnya memeriksa direktori baru yang terakhir dengan menggunakan:

export PATH=${PATH}:~/bin

Untuk membuat PATHtetap ada login berikutnya, tambahkan ke .profilefile rc shell atau lainnya.

kurtm
sumber
2

Coba ini, menggunakan :

printf '%s\n' ${PATH//:/\/* }
Gilles Quenot
sumber
1

Jika Anda menekan tombol tab dua kali dan kemudian y, Anda akan mendapatkan daftar semua perintah yang tersedia di shell Anda saat ini. Untuk pertanyaan kedua saya pikir Anda harus menggunakan alias: shell alias .

coffeMug
sumber
Mengenai alias, apakah itu cara bodoh untuk menimpa dan tidak mengesampingkan (dengan "membatalkan") perintah ketika dipanggil di mana saja pada sistem (misalnya dari skrip shell)?
themirror
1
Shell apa yang Anda gunakan? Saya tidak bisa mendapatkan tab ganda untuk mencantumkan semua perintah di bash saya.
terdon
Saya menggunakan bash di Ubuntu 13.04. Ada juga perintah yang disebut compgen yang dapat digunakan untuk mendapatkan daftar semua perintah yang tersedia di bash.
coffeMug
@terdon. Apakah Anda memiliki penyelesaian bash yang diinstal?
coffeMug
1
atur show-all-if-ambiguous
coffeMug