Pada awalnya saya mencari alasan yang which
tidak menghasilkan apa-apa setelah memberikannya program tertentu sebagai argumen, misalnya cd
.
Dari apa yang saya temukan di sini , alasannya mungkin adalah bahwa cd
pada mesin saya adalah fungsi, yang dikonfirmasi dengan menjalankan type cd
.
TLDR: Tetapi ketika program normal yang which
dapat menemukan berkat $PATH
variabel ditempatkan di salah satu $PATH
folder itu, di mana fungsi atau skrip suka cd
disimpan?
user@linuxmchine:~$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
linux
bash
shell-script
Gabrijel Šimunović
sumber
sumber
cd is a shell builtin
. Lihatlah halaman manual untuk shell Anda (zsh?)Jawaban:
Fungsi yang ditentukan pengguna
Biasanya fungsi bash disimpan secara permanen dalam
bash
skrip start-up./etc/profile
untuk shell login, dan/etc/bashrc
untuk shell interaktif.~/.bash_profile
untuk shell login, dan~/.bashrc
untuk shell interaktif.man
halaman 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.c
definisi untuk tabel adalah:Fungsi yang ditentukan pengguna dapat didaftar dengan
declare
perintah bash , shell lain masih digunakantypeset
. In bashdeclare
telah melampauitypeset
perintah.Fungsi-fungsi yang ada dalam memori untuk masa pakai bash shell.
Fungsi yang ditentukan shell (builtin)
Ini adalah fungsi umum seperti
echo
,printf
,cd
dan:
. Mereka dikompilasi ke perpustakaan yang terhubung kebash
executable. Membangun definisi ke dalam executable menghemat waktu dibandingkan dengan memuat definisi eksternal. Definisi untuk fungsi-fungsi ini (disimpan dalam.def
file sumber yang diurai menjadi sumber C) disimpan dalambuiltins
direktori sumber bash.Samping yang bermanfaat: untuk informasi tentang penggunaan perintah builtin shell
help <command>
. misalnyasumber
typeset
itu akan menunjukkan file / skrip apa yang menyebabkan pembuatan / perubahan fungsi?declare
atautypeset
perintah untuk menampilkan file sumber dari definisi fungsi. Saya pikir ini masalah rekayasa perangkat lunak. Baru-baru ini menemukan fungsi shell didefinisikan dalam.alias
file - bukan apa yang saya harapkan!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_profile
atau sesuatu yang serupa) dan mereka berhenti ada ketika shell berakhir.sumber
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.)cd
dan perintah umum lainnya sepertiecho
,type
&alias
disebut bawaan .Perintah builtin terdapat di dalam shell itu sendiri dan shell yang berbeda mungkin memiliki perintah bawaan yang berbeda.
sumber
cd
terkandung dalam program shell itu sendiri, misalnya dalam file/bin/bash
jika itu adalah shell Anda. (Saya pikir kata-kata Anda di sini jelas, tetapi saya telah melihat orang-orang menjadi bingung oleh segala hal.)Pertanyaan Pengguna Super Menemukan definisi fungsi bash terkait erat dengan yang ini. HairOfTheDog Pengguna memberikan jawaban ini (diparafrasekan):
Di atas mungkin hanya berfungsi di
bash
, dan tidak di shell POSIX secara umum.Terima kasih kepada Blue Raspberry untuk menemukan ini!
sumber