Di mana fungsi shell disimpan di Linux?

11

Pada awalnya saya mencari alasan yang whichtidak menghasilkan apa-apa setelah memberikannya program tertentu sebagai argumen, misalnya cd.

Dari apa yang saya temukan di sini , alasannya mungkin adalah bahwa cdpada mesin saya adalah fungsi, yang dikonfirmasi dengan menjalankan type cd.

TLDR: Tetapi ketika program normal yang whichdapat menemukan berkat $PATHvariabel ditempatkan di salah satu $PATHfolder itu, di mana fungsi atau skrip suka cddisimpan?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
Gabrijel Šimunović
sumber
Saya mengerti cd is a shell builtin. Lihatlah halaman manual untuk shell Anda (zsh?)
Xen2050
1
Lihat unix.stackexchange.com/questions/85249/... Masalahnya adalah perintah legacy yang tidak boleh digunakan - terutama karena hal-hal seperti pertanyaan ini.
Joe

Jawaban:

12

Fungsi yang ditentukan pengguna

Biasanya fungsi bash disimpan secara permanen dalam bashskrip start-up.

  • Skrip start-up seluruh sistem: /etc/profileuntuk shell login, dan /etc/bashrcuntuk shell interaktif.
  • Pengguna menentukan skrip start-up: ~/.bash_profileuntuk shell login, dan ~/.bashrcuntuk shell interaktif.
  • Informasi lebih lanjut tentang shell interaktif / login dapat ditemukan di manhalaman bash di bagian INVOCATION.

Fungsi shell yang ditentukan pengguna dimuat secara dinamis dalam hash (atau tabel pencarian) saat bash dimulai. Dari file sumber bash variable.cdefinisi untuk tabel adalah:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Fungsi yang ditentukan pengguna dapat didaftar dengan declareperintah bash , shell lain masih digunakan typeset. In bash declaretelah melampaui typesetperintah.

declare -f

Fungsi-fungsi yang ada dalam memori untuk masa pakai bash shell.

Fungsi yang ditentukan shell (builtin)

Ini adalah fungsi umum seperti echo, printf, cddan :. Mereka dikompilasi ke perpustakaan yang terhubung ke bashexecutable. Membangun definisi ke dalam executable menghemat waktu dibandingkan dengan memuat definisi eksternal. Definisi untuk fungsi-fungsi ini (disimpan dalam .deffile sumber yang diurai menjadi sumber C) disimpan dalam builtinsdirektori sumber bash.

Samping yang bermanfaat: untuk informasi tentang penggunaan perintah builtin shell help <command>. misalnya

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
tersangka
sumber
Terima kasih atas jawaban kutipan itu. Inilah yang sebenarnya saya cari. Apakah Anda pikir ada alat untuk mengikuti proses pembuatan fungsi bash atau sesuatu seperti typesetitu akan menunjukkan file / skrip apa yang menyebabkan pembuatan / perubahan fungsi?
Gabrijel Šimunović
Saya tidak tahu alat seperti itu - itu akan menjadi opsi yang berguna untuk declareatau typesetperintah untuk menampilkan file sumber dari definisi fungsi. Saya pikir ini masalah rekayasa perangkat lunak. Baru-baru ini menemukan fungsi shell didefinisikan dalam .aliasfile - bukan apa yang saya harapkan!
tersangka
8

Fungsi Shell disimpan dalam memori shell (atau, mungkin, dalam file sementara tidak berdokumen). Mereka tidak ada cara apapun yang dapat digunakan hingga shell dimulai (misalnya, ketika Anda login ke CLI, atau memulai sebuah jendela shell seperti xterm) dan mereka didefinisikan (misalnya, dengan membaca .bashrc, .bash_profileatau sesuatu yang serupa) dan mereka berhenti ada ketika shell berakhir.

G-Man Mengatakan 'Reinstate Monica'
sumber
1
Sifat fana dari sesuatu yang Anda ketik saat diminta adalah penting. Suara saya memilih jawaban ini. Jika Anda mengetikkan cd () { pwd; builtin cd "$@"; }prompt, satu-satunya tempat yang disimpan adalah dalam memori shell Anda yang sedang berjalan. (Contoh saya adalah Bash tetapi prinsip yang sama berlaku untuk shell apa pun.)
tripleee
6

cddan perintah umum lainnya seperti echo, type& aliasdisebut bawaan .

Perintah builtin terdapat di dalam shell itu sendiri dan shell yang berbeda mungkin memiliki perintah bawaan yang berbeda.

Nifle
sumber
4
Saya tidak tahu apakah mungkin perlu menekankan bahwa kode yang dapat dieksekusi untuk perintah builtin seperti cdterkandung dalam program shell itu sendiri, misalnya dalam file /bin/bashjika itu adalah shell Anda. (Saya pikir kata-kata Anda di sini jelas, tetapi saya telah melihat orang-orang menjadi bingung oleh segala hal.)
David Z
1

Pertanyaan Pengguna Super Menemukan definisi fungsi bash terkait erat dengan yang ini. HairOfTheDog Pengguna memberikan jawaban ini (diparafrasekan):

Perintah berikut akan melaporkan lokasi (nama file dan nomor baris) dari definisi fungsi. Dengan asumsi fungsi bernama foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Sebagai contoh, output dari perintah ini mungkin:

foo 32 /source/private/main/developer/cue.pub.sh

Di atas mungkin hanya berfungsi di bash, dan tidak di shell POSIX secara umum.

Terima kasih kepada Blue Raspberry untuk menemukan ini!

G-Man
sumber