Shell işlevleri Linux'ta nerede depolanır?


11

İlk başta, whichbelirli programları bir argüman olarak verdikten sonra herhangi bir çıktı vermemenin nedenini arıyordum , örneğin cd.

Burada bulduğumdan , muhtemelen cdmakinemde çalışarak onaylanan bir işlev olması type cd.

TLDR: Ancak değişken whichsayesinde bulabilen normal programlar $PATHbu $PATHklasörlerden birine yerleştirilirken , işlevler veya komut dosyaları nerede cddepolanır?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

Anladım cd is a shell builtin. Kabuğunuz için adam sayfasına bir göz atın (zsh?)
Xen2050

1
Check out unix.stackexchange.com/questions/85249/... özellikle çünkü bu soru gibi şeyler - Sorun kullanılmamalıdır eski komut olduğu olmasıdır.
Joe

Yanıtlar:


12

Kullanıcı tanımlı işlevler

Genellikle bash işlevleri bir bashbaşlatma komut dosyasında kalıcı olarak depolanır .

  • Sistem çapında başlatma komut dosyaları: /etc/profilegiriş kabukları ve /etc/bashrcetkileşimli kabuklar için.
  • Kullanıcı başlangıç ​​komut dosyalarını tanımlar: ~/.bash_profilegiriş kabukları ve ~/.bashrcetkileşimli kabuklar için.
  • İnteraktif / giriş mermileri hakkında daha fazla bilgiyi manİNOVOCATION bölümündeki bash sayfasında bulabilirsiniz.

Kullanıcı tanımlı kabuk işlevleri, bash başladığında bir karma (veya arama tablosu) içine dinamik olarak yüklenir. Bash kaynak dosyasından variable.ctablonun tanımı:

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

Kullanıcı tanımlı işlevler bash declarekomutuyla listelenebilir , diğer kabuklar hala kullanır typeset. Bash declaresuperceded etti typesetkomutu.

declare -f

Fonksiyonlar bash kabuğunun ömrü boyunca hafızada bulunur.

Kabuk tanımlı (yerleşik) işlevler

Bunlar gibi yaygın işlevleri vardır echo, printf, cdve :. bashYürütülebilir dosyaya bağlı bir kitaplığa derlenirler . Tanımların yürütülebilir dosyaya oluşturulması, harici bir tanım yüklemeye kıyasla zaman kazandırır. Bu işlevlerin tanımları ( .defC kaynağına ayrıştırılan kaynak dosyalarda tutulur) builtinsbash kaynağı dizininde tutulur .

Yararlı bir kenara: kabuk yerleşik komut kullanımı hakkında bilgi için help <command>. Örneğin

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

Alıntı için teşekkür ederim. Tam da aradığım şey bu. İşlem oluşturan bash işlevlerini takip etmek için bir araç olduğunu mu düşünüyorsunuz ya da böyle bir şey typesetbir işlevin oluşturulmasına / değişmesine hangi dosya / komut dosyasının neden olduğunu gösterecektir?
Gabrijel Šimunović

Böyle bir araç bilmiyorum - declareveya typesetbir işlev tanımının kaynak dosyasını görüntülemek için yararlı bir seçenek olurdu . Bence bu bir yazılım mühendisliği meselesi. Son zamanlarda bir .aliasdosyada tanımlanan bir kabuk işlevi bulundu - beklediğim değil!
şüpheli

8

Kabuk işlevleri kabuğun belleğinde (veya belki de belgesiz geçici dosyalarda) saklanır. Onlar (bir CLI giriş veya örneğin bir kabuk penceresini başladığınızda mesela, kabuk başlayana kadar hiçbir kullanışlı bir şekilde var olmayan xterm) ve onlar (örneğin okuyarak tanımlanır .bashrc, .bash_profilebenzer, ya da bir şey) ve sona kabuk sona erdiğinde var olur.


1
Komut satırına yazdığınız bir şeyin geçici niteliği önemlidir. Oyum bu cevaba gidiyor. Bilgi cd () { pwd; builtin cd "$@"; }istemine yazarsanız , depolanan tek yer o anda çalışan kabuğunuzun belleğindedir. (
Örneğim

6

cdve diğer ortak komutları gibi echo, type& aliasböylece denir yerleşiklerini .

Yerleşik komutlar kabuğun içinde bulunur ve farklı kabuklarda farklı yerleşik komutlar olabilir.


4
Gibi yerleşik komutlar için yürütülebilir kod cdkabuk programın içinde, örneğin bu kabuk ise dosya içinde yer olduğunu vurgulamak değer olup olmadığını bilmiyorum /bin/bash. (Sanırım buradaki ifadeniz açık, ama insanların her türlü şeyle karıştırıldığını gördüm.)
David Z

1

Süper Kullanıcı sorusu Bir bash işlevinin tanımını bulmak, bununla yakından ilgilidir. Kullanıcı HairOfTheDog sağlanan bu cevabı (aktarılan):

Aşağıdaki komutlar bir işlevin tanımının konumunu (dosya adı ve satır numarası) bildirir. Adında bir işlev olduğu varsayılarak 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

Örneğin, bu komutların çıktıları şunlar olabilir:

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

Yukarıdakiler bashgenel olarak POSIX mermilerinde değil, sadece çalışabilir .

Bunu bulduğu için Blue Raspberry'e teşekkürler !

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.