Bagaimana cara memasukkan file dalam skrip bash shell

121

Apakah ada cara untuk menyertakan skrip shell lain dalam skrip shell agar dapat mengakses fungsinya?

Seperti bagaimana di PHP Anda dapat menggunakan includedirektif dengan file PHP lain untuk menjalankan fungsi yang ada di dalamnya hanya dengan memanggil nama fungsi.

Mechaflash
sumber
kemungkinan duplikat Bash: Cara terbaik untuk menyertakan skrip lain?
Troubadour
@Troubadour terima kasih atas referensinya. Meskipun posting mengacu pada sourceperintah, pertanyaannya sendiri adalah menanyakan bagaimana menentukan lokasi sourcefile.
Mechaflash
1
"pertanyaan dasar" adalah katalisator dari stack overflow. Anda memahami bahwa situs ini diindeks seperti situs lain, dan sekarang "cara menyertakan file dalam skrip bash shell" akan muncul di Google yang menautkan ke stack overflow sehingga meningkatkan lalu lintas dan keterpaparan situs. = D
Mechaflash
3
Anda pintar! Terima kasih luar biasa Anda!
Mechaflash
4
@Troubadour, konyol berkomentar bahwa pengguna seharusnya mencari jawabannya di Google, padahal begitulah cara saya sampai ke halaman. Misalnya, hari ini pertanyaan khusus ini adalah hasil Google teratas untuk "bash include file". Haruskah saya melewatkan jawaban ini untuk menemukan solusi lain?
lwitzel

Jawaban:

192

Cukup masukkan ke dalam skrip Anda:

source FILE

Atau

. 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.
Gilles Quenot
sumber
17
Catat itu. sesuai dengan POSIX sedangkan sumber tidak
Mathieu_Du
Tetapi di sini sumber tidak persis sama seperti yang kita lakukan dalam Cbahasa. Di sini sumber menjalankan skrip anak ke dalam skrip utama. Bagaimana jika saya hanya ingin memanggil fungsi tertentu dari skrip anak?
Paresh Mayani
8
Jangan bingung . script.shdengan ./script.sh. Saya kehilangan waktu berjam-jam mencoba mencari tahu apa yang sedang terjadi
Tihomir Mitkov
Sementara. sesuai dengan POSIX, yang berarti ia akan bekerja pada sh, dash, zsh, dan shell POSIX lainnya. Lebih baik digunakan. karena beberapa shell memiliki versi "source" mereka sendiri, serupa, tetapi sedikit berbeda yang dapat merusak aplikasi Anda.
Jacob Korba
51

Jawaban di atas benar, tetapi jika menjalankan skrip di folder lain, akan ada beberapa masalah.

Misalnya, a.shdan b.shberada di folder yang sama, a include b dengan . ./b.shmenyertakan.

Ketika menjalankan script dari folder, misalnya dengan xx/xx/xx/a.sh, berkas b.shtidak akan ditemukan: ./b.sh: No such file or directory.

saya menggunakan

. $(dirname "$0")/b.sh
Fancyoung
sumber
33

Ya, gunakan source atau bentuk singkatnya yang hanya .:

. other_script.sh
Paul
sumber
3
Perhatikan bahwa .versi bekerja shsebaik Bash. The "source" hanya berfungsi di Bash.
Sridhar Sarnobat
2

Dalam situasi saya, untuk memasukkan color.shdari direktori yang sama ke dalam init.sh, saya harus melakukan sesuatu sebagai berikut.

. ./color.sh

Tidak yakin mengapa ./dan tidak color.shsecara langsung. Isinya color.shadalah sebagai berikut.

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

Memanfaatkan File color.shtidak kesalahan tetapi, warna tidak ditampilkan. Saya telah menguji ini Ubuntu 18.04dan Bashversinya adalah:

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

Raf
sumber
Itu hanya akan memberi Anda file di direktori kerja Anda saat ini, bukan direktori di mana init.sh(mereka bertepatan jika Anda meluncurkannya dengan ./init.shdi tempat pertama).
ricab