วิธีรวมไฟล์ในสคริปต์ bash shell


122

มีวิธีรวมเชลล์สคริปต์อื่นในเชลล์สคริปต์เพื่อให้สามารถเข้าถึงฟังก์ชันได้หรือไม่?

เช่นเดียวกับใน PHP คุณสามารถใช้includeคำสั่งกับไฟล์ PHP อื่น ๆ เพื่อเรียกใช้ฟังก์ชันที่มีอยู่ภายในเพียงแค่เรียกชื่อฟังก์ชัน



@Troubadour ขอบคุณสำหรับข้อมูลอ้างอิง แม้ว่าโพสต์จะอ้างถึงsourceคำสั่ง แต่คำถามในตัวเองคือถามว่าจะระบุตำแหน่งของsourceไฟล์ได้อย่างไร
Mechaflash

1
"คำถามพื้นฐาน" เป็นตัวเร่งของสแต็กล้น คุณเข้าใจดีว่าไซต์นี้ได้รับการจัดทำดัชนีเหมือนกับไซต์อื่น ๆ และตอนนี้ "วิธีรวมไฟล์ในสคริปต์ bash เชลล์" จะปรากฏขึ้นบน Google ที่ลิงก์ไปยังสแต็กโอเวอร์โฟลว์ซึ่งจะช่วยเพิ่มการเข้าชมไซต์และการแสดงผล = D
Mechaflash

3
คุณฉลาด! ขอบคุณสุดยอด!
Mechaflash

4
@Troubadour เป็นเรื่องโง่ที่จะแสดงความคิดเห็นว่าผู้ใช้ควรจะไปหาคำตอบเมื่อนั่นคือวิธีที่ฉันไปที่หน้า ตัวอย่างเช่นวันนี้คำถามเฉพาะนี้เป็นผลการค้นหาอันดับต้น ๆ ของ Google สำหรับ "bash include file" ฉันควรข้ามคำตอบนี้เพื่อหาวิธีแก้ปัญหาอื่นหรือไม่
lwitzel

คำตอบ:


193

เพียงใส่เข้าไปในสคริปต์ของคุณ:

source FILE

หรือ

. FILE # POSIX compliant

$ LANG=C help source
source: source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.

17
โปรดทราบว่า เป็นไปตาม POSIX ในขณะที่ซอร์สไม่ใช่
Mathieu_Du

แต่แหล่งที่มาที่นี่ไม่ได้รวมเหมือนกับที่เราทำในCภาษา ที่มานี้กำลังเรียกใช้สคริปต์ลูกในสคริปต์หลัก จะเกิดอะไรขึ้นถ้าฉันต้องการเรียกใช้ฟังก์ชันเฉพาะจากสคริปต์ลูก
Paresh Mayani

8
อย่าสับสนกับ. script.sh ./script.shฉันเสียเวลาไปหลายชั่วโมงในการพยายามคิดว่าเกิดอะไรขึ้น
Tihomir Mitkov

ในขณะที่ เป็นไปตาม POSIX ซึ่งหมายความว่ามันจะทำงานบน sh, dash, zsh และเชลล์ POSIX อื่น ๆ จะดีกว่าที่จะใช้ เนื่องจากเชลล์บางตัวมี "แหล่งที่มา" เป็นของตัวเอง แต่มีเวอร์ชันที่แตกต่างกันเล็กน้อยซึ่งอาจทำให้แอปของคุณเสียหายได้
Jacob Korba

52

คำตอบด้านบนถูกต้อง แต่ถ้าเรียกใช้สคริปต์ในโฟลเดอร์อื่นจะมีปัญหา

ตัวอย่างเช่นa.shและb.shอยู่ในโฟลเดอร์เดียวกันรวม b ด้วย . ./b.shเพื่อรวม

เมื่อเรียกใช้สคริปต์จากโฟลเดอร์เช่นกับxx/xx/xx/a.shไฟล์จะไม่พบ:b.sh./b.sh: No such file or directory

ฉันใช้

. $(dirname "$0")/b.sh

33

ใช่ใช้แหล่งที่มาหรือรูปแบบสั้น ๆ ซึ่งเป็นเพียง.:

. other_script.sh

3
โปรดทราบว่า.เวอร์ชันใช้งานได้shเช่นเดียวกับ Bash "แหล่งที่มา" ใช้งานได้ใน Bash เท่านั้น
Sridhar Sarnobat

2

ในสถานการณ์ของฉันเพื่อที่จะรวมcolor.shจากไดเรกทอรีเดียวกันในinit.shฉันต้องทำบางสิ่งดังนี้

. ./color.sh

ไม่แน่ใจว่าทำไมถึง./ไม่color.shตรง เนื้อหาcolor.shมีดังนี้

RED=`tput setaf 1`
GREEN=`tput setaf 2`
BLUE=`tput setaf 4`
BOLD=`tput bold`
RESET=`tput sgr0`

การใช้งานFile color.shไม่ผิดพลาด แต่สีไม่แสดง ฉันได้ทดสอบสิ่งนี้Ubuntu 18.04แล้วและBashเวอร์ชันคือ:

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)


นั่นจะทำให้คุณได้ไฟล์ในไดเร็กทอรีการทำงานปัจจุบันของคุณไม่ใช่ไดเร็กทอรีที่init.shอยู่ (มันตรงกับที่คุณเปิดใช้./init.shตั้งแต่แรก)
ricab

1

ไวยากรณ์คือ source <file-name>

อดีต source config.sh

สคริปต์ - config.sh

USERNAME="satish"
EMAIL="satish@linuxconcept.com"

สคริปต์การโทร -

#!/bin/bash
source config.sh
echo Welcome ${USERNAME}!
echo Your email is ${EMAIL}.

คุณสามารถเรียนรู้ที่จะรวมถึงการทุบตีสคริปต์ในสคริปต์ทุบตีที่นี่อีก

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