ฉันได้กำหนดbash
ฟังก์ชั่นใน~/.bashrc
ไฟล์ของฉัน สิ่งนี้ทำให้ฉันใช้มันในเทอร์มินัลเชลล์ อย่างไรก็ตามดูเหมือนว่าจะไม่มีอยู่เมื่อฉันเรียกมันจากภายในสคริปต์
ฉันจะกำหนดbash
ฟังก์ชั่นที่สคริปต์ใช้งานได้อย่างไร?
/bin/sh
อยู่ในบรรทัด shebang หรือไม่?
ฉันได้กำหนดbash
ฟังก์ชั่นใน~/.bashrc
ไฟล์ของฉัน สิ่งนี้ทำให้ฉันใช้มันในเทอร์มินัลเชลล์ อย่างไรก็ตามดูเหมือนว่าจะไม่มีอยู่เมื่อฉันเรียกมันจากภายในสคริปต์
ฉันจะกำหนดbash
ฟังก์ชั่นที่สคริปต์ใช้งานได้อย่างไร?
/bin/sh
อยู่ในบรรทัด shebang หรือไม่?
คำตอบ:
~/.bash_profile
และ~/.bashrc
ไม่ได้ถูกอ่านโดยสคริปต์และฟังก์ชั่นจะไม่ถูกส่งออกโดยค่าเริ่มต้น ในการทำเช่นนั้นคุณสามารถใช้export -f
สิ่งต่อไปนี้:
$ cat > script << 'EOF'
#!/bin/bash
foo
EOF
$ chmod a+x script
$ ./script
./script: line 2: foo: command not found
$ foo() { echo "works" ; }
$ export -f foo
$ ./script
works
export -f foo
อาจถูกเรียกใช้~/.bash_profile
เพื่อให้ฟังก์ชันนี้พร้อมใช้งานกับสคริปต์หลังจากเข้าสู่ระบบ ถูกเตือนว่าexport -f
ไม่สามารถพกพาได้
. file
วิธีการแก้ปัญหาที่ดีกว่าจะมาไฟล์ที่มีฟังก์ชั่นการใช้ สิ่งนี้สามารถพกพาได้มากกว่าและไม่ต้องพึ่งพาสภาพแวดล้อมของคุณในการตั้งค่าด้วยวิธีใดวิธีหนึ่ง
function myFunction { ... }
ใน~/.bash_profile
และคุณจะไปดี?
export
โซลูชันดูเหมือนว่าจะทำงานอย่างถูกต้อง ขอบคุณ
foo
ฟังก์ชั่นบางอย่างจากบางคนfile
2) คุณสามารถควบคุมเนื้อหาของมันได้file
ดีกว่าตรวจสอบให้แน่ใจว่า ไม่เปลี่ยนแปลงfoo
ก่อนที่จะเรียกใช้สคริปต์ของคุณ คุณสามารถเพิ่มการตรวจสอบความปลอดภัยfile
เพื่อให้แน่ใจว่าไม่มีการแก้ไขเช่น (ไม่ใช่เรื่องง่าย แต่เป็นไปได้) (ดีคุณสามารถตรวจสอบสิ่งเหล่านั้นบนฟังก์ชั่น foo ที่กำหนดได้ ... แต่คุณจะได้ดริฟท์ของฉัน ^^ ฉันคิดว่าวิธีที่ 2 นั้นสะอาดกว่า) 3) file
จะมีเฉพาะสิ่งที่จำเป็นเท่านั้น
.bashrc
ถูกอ่านโดยเชลล์เชิงโต้ตอบเท่านั้น (จริงที่เปลือก: ทุบตีเป็นโวหารในแง่นี้ทุบตีไม่ได้อ่าน. .bashrc
ถ้ามันเป็นเปลือกเข้าสู่ระบบแบบโต้ตอบหรือไม่และมีข้อยกเว้นแม้กระทั่งการยกเว้น. ถ้าการปกครองทุบตีเป็นrshd
หรือsshd
แล้วทุบตีไม่อ่าน.bashrc
, ไม่ว่าจะเป็นแบบโต้ตอบหรือไม่)
ใส่คำนิยามฟังก์ชั่นของคุณในไฟล์ในสถานที่ที่รู้จักและใช้builtin .
(หรือตัวสะกดsource
) เพื่อรวมไฟล์นั้นไว้ในสคริปต์
$ cat ~/lib/bash/my_functions.bash
foo () {
…
$ cat ~/bin/myscript
#!/bin/bash
. ~/lib/bash/my_functions.bash
foo bar
หากคุณต้องการคุณสามารถติดตามคุณสมบัติ autoload ของ ksh ได้ ใส่คำจำกัดความของฟังก์ชันแต่ละรายการลงในไฟล์ที่มีชื่อเหมือนกับฟังก์ชัน แสดงรายการไดเร็กทอรีที่มีนิยามฟังก์ชันในFPATH
ตัวแปร (รายการไดเร็กทอรีที่คั่นด้วยโคลอน) นี่เป็นค่าประมาณคร่าวๆของ ksh autoload
ซึ่งจริง ๆ แล้วโหลดฟังก์ชั่นทันทีแทนการตามต้องการ:
autoload () {
set -- "$(set +f; IFS=:;
for d in $FPATH; do
if [ -r "$d/$1" ]; then echo -E "$d/$1"; break; fi;
done)"
[[ -n $1 ]] && . "$1"
}
คุณต้องการฟังก์ชั่นหรือไม่? $PATH
ถ้าไม่ได้พิจารณาดึงออกมาจากตรรกะเป็นที่แยกจากกันทุบตีสคริปต์ยืนอยู่คนเดียวในของคุณ ตัวอย่างเช่นฉันมีสิ่งนี้ใน~/.bashrc
:
# echo public IP address
alias wanip='dig +short myip.opendns.com @resolver1.opendns.com'
~/bin
อยู่ในฉัน$PATH
ดังนั้นฉันสร้าง~/bin/wanip
ด้วยเนื้อหาต่อไปนี้:
#!/bin/bash
# echo public IP address
dig +short myip.opendns.com @resolver1.opendns.com
และวิ่งchmod 0755 ~/bin/wanip
ไปทำให้มันสามารถปฏิบัติการได้ ตอนนี้ฉันสามารถรันwanip
จากสคริปต์อื่น ๆ
ฉันชอบที่มีwanip
สคริปต์ Bash แบบสแตนด์อะโลน มันเตือนฉันว่าฉันต้องการตรรกะนี้โดยทั่วไป (นอกเหนือจากเพียงในเซสชั่นทุบตีโต้ตอบของฉันในปัจจุบัน) สคริปต์แค็ปซูลลอจิกและเอกสารเหมือนกัน