ฟังก์ชั่นเชลล์เก็บอยู่ที่ไหนบน Linux?


11

ในตอนแรกที่ผมกำลังมองหาเหตุผลที่ทำอะไรไม่ถูกขับออกหลังจากที่ให้มันบางโปรแกรมเป็นอาร์กิวเมนต์เช่นwhichcd

จากสิ่งที่ฉันได้พบที่นี่เหตุผลที่อาจเป็นว่าในเครื่องของฉันเป็นฟังก์ชั่นซึ่งได้รับการยืนยันจากการทำงานcdtype cd

TLDR:แต่ตามปกติแล้วโปรแกรมที่whichสามารถค้นหาด้วย$PATHตัวแปรจะถูกวางไว้ในหนึ่งใน$PATHโฟลเดอร์เหล่านั้นฟังก์ชั่นหรือสคริปต์ที่cdเก็บไว้เป็นอย่างไร

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

cd is a shell builtinฉันได้รับ ดูหน้า man สำหรับ shell ของคุณ (zsh?)
Xen2050

1
ลองดูunix.stackexchange.com/questions/85249/…ปัญหาคือสิ่งที่เป็นคำสั่งดั้งเดิมที่ไม่ควรใช้ - โดยเฉพาะอย่างยิ่งเพราะสิ่งต่าง ๆ เช่นคำถามนี้
Joe

คำตอบ:


12

ฟังก์ชั่นที่ผู้ใช้กำหนด

โดยทั่วไปแล้วฟังก์ชันทุบตีจะถูกจัดเก็บอย่างถาวรในbashสคริปต์เริ่มต้น

  • สคริปต์เริ่มทำงานทั้งระบบ: /etc/profileสำหรับเชลล์ล็อกอินและ/etc/bashrcสำหรับเชลล์โต้ตอบ
  • ผู้ใช้กำหนดสคริปต์เริ่มต้น: ~/.bash_profileสำหรับล็อกอินเชลล์และ~/.bashrcสำหรับเชลล์เชิงโต้ตอบ
  • ข้อมูลเพิ่มเติมเกี่ยวกับเชลล์แบบโต้ตอบ / ล็อกอินสามารถพบได้ในmanหน้าทุบตีในส่วน INVOCATION

ฟังก์ชันเชลล์ที่ผู้ใช้กำหนดจะถูกโหลดแบบไดนามิกในแฮช (หรือตารางการค้นหา) เมื่อเริ่มใช้งาน bash จากไฟล์ซอร์ส bash variable.cนิยามสำหรับตารางคือ:

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

ฟังก์ชั่นที่ผู้ใช้กำหนดสามารถจดทะเบียนที่มีทุบตีdeclareคำสั่งหอยอื่น ๆ typesetยังคงใช้ ใน bash declareได้แทนที่typesetคำสั่ง

declare -f

ฟังก์ชันมีอยู่ในหน่วยความจำสำหรับอายุการใช้งานของ bash shell

ฟังก์ชั่นที่กำหนดโดยเชลล์ (builtin)

เหล่านี้เป็นฟังก์ชั่นทั่วไปเช่นecho, printf, และcd :พวกเขาจะรวบรวมไว้ในห้องสมุดที่เชื่อมโยงเข้ากับbashปฏิบัติการ การสร้างคำจำกัดความลงในไฟล์สั่งการช่วยประหยัดเวลาเมื่อเปรียบเทียบกับการโหลดคำจำกัดความภายนอก คำจำกัดความสำหรับฟังก์ชั่นเหล่านี้ (เก็บไว้ใน.defไฟล์ต้นฉบับซึ่งแยกวิเคราะห์ในซอร์ส C) จะถูกเก็บไว้ในbuiltinsไดเรกทอรีของซอร์ส bash

ที่มีประโยชน์กัน: help <command>สำหรับข้อมูลเกี่ยวกับการใช้งานคำสั่งเชลล์ เช่น

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

ขอบคุณสำหรับคำตอบที่ตัดตอนมา นี่คือสิ่งที่ฉันกำลังมองหา คุณคิดว่ามีเครื่องมือในการติดตามฟังก์ชั่นทุบตีการสร้างกระบวนการหรือสิ่งtypesetที่จะแสดงไฟล์ / สคริปต์ที่ก่อให้เกิดการสร้าง / เปลี่ยนฟังก์ชั่นหรือไม่?
Gabrijel Šimunović

ฉันไม่รู้เครื่องมือดังกล่าว - มันจะเป็นตัวเลือกที่มีประโยชน์สำหรับคำสั่งdeclareหรือtypesetเพื่อแสดงไฟล์ต้นฉบับของนิยามฟังก์ชัน ฉันคิดว่ามันเป็นปัญหาด้านวิศวกรรมซอฟต์แวร์ เมื่อเร็ว ๆ นี้พบว่าฟังก์ชั่นเชลล์ที่กำหนดไว้ใน.aliasไฟล์ - ไม่ใช่สิ่งที่ฉันคาดหวัง!
suspectus

8

ฟังก์ชั่นเชลล์ถูกเก็บไว้ในหน่วยความจำของเชลล์ (หรืออาจเป็นไฟล์ชั่วคราวที่ไม่มีเอกสาร) พวกเขาไม่ได้อยู่ในลักษณะที่ใช้งานใด ๆ จนกว่าเปลือกเริ่มต้น (เช่นเมื่อคุณเข้าสู่ระบบเพื่อ CLI หรือเริ่มต้นหน้าต่างเปลือกเช่นxterm) และพวกเขามีการกำหนด (เช่นโดยการอ่าน.bashrc, .bash_profileหรือสิ่งที่คล้ายกัน) และพวกเขาหยุด มีอยู่เมื่อเชลล์หยุดทำงาน


1
ลักษณะชั่วคราวของสิ่งที่คุณพิมพ์ที่พรอมต์นั้นสำคัญ คะแนนของฉันไปที่คำตอบนี้ หากคุณพิมพ์cd () { pwd; builtin cd "$@"; }ที่พรอมต์สถานที่เดียวเท่านั้นที่เก็บไว้ในหน่วยความจำของเชลล์ที่คุณใช้งานอยู่ในปัจจุบัน (ตัวอย่างของฉันคือ Bash แต่หลักการเดียวกันนี้ใช้กับเชลล์ใดก็ได้)
3031414

6

cdและคำสั่งอื่น ๆ ทั่วไปชอบecho, typeและaliasได้รับการเรียกว่าbuiltins

คำสั่ง Builtin มีอยู่ภายในตัวเชลล์เองและเชลล์ที่ต่างกันอาจมีคำสั่งในตัวที่แตกต่างกัน


4
ฉันไม่รู้ว่ามันคุ้มค่าหรือไม่ที่เน้นว่าโค้ดที่เรียกใช้งานได้สำหรับคำสั่ง builtin เช่นcdนั้นมีอยู่ในตัวโปรแกรมเชลล์เช่นในไฟล์/bin/bashถ้านั่นคือเชลล์ของคุณ (ฉันคิดว่าถ้อยคำของคุณที่นี่ชัดเจน แต่ฉันเห็นผู้คนสับสนทุกเรื่อง)
เดวิด Z

1

คำถามผู้ใช้ขั้นสูงการค้นหาคำจำกัดความของฟังก์ชั่น bash นั้นเกี่ยวข้องกับสิ่งนี้อย่างใกล้ชิด ผู้ใช้HairOfTheDogให้คำตอบนี้ (ถอดความ):

คำสั่งต่อไปนี้จะรายงานตำแหน่ง (ชื่อไฟล์และหมายเลขบรรทัด) ของคำจำกัดความของฟังก์ชั่น สมมติว่าฟังก์ชั่นที่มีชื่อว่า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

ตัวอย่างเช่นผลลัพธ์ของคำสั่งเหล่านี้อาจเป็น:

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

ข้างต้นอาจทำงานได้เฉพาะในbashและไม่ได้อยู่ในเปลือก POSIX โดยทั่วไป

ขอบคุณBlue Raspberryสำหรับการค้นหา!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.