Bir bash kabuğu betiğine dosya nasıl eklenir


122

İşlevlerine erişebilmek için bir kabuk betiğine başka bir kabuk betiği eklemenin bir yolu var mı?

Tıpkı PHP'de include, içinde bulunan işlevleri basitçe işlev adını çağırarak çalıştırmak için yönergeyi diğer PHP dosyalarıyla birlikte kullanabilirsiniz .



@Troubadour referans için teşekkürler. Gönderi sourcekomuta atıfta bulunsa da , soru kendi başına bir sourcedosyanın konumunu nasıl belirleyeceğidir .
Mechaflash

1
"temel sorular" yığın taşmasının katalizörüdür. Bu sitenin diğer siteler gibi dizine eklendiğini ve artık "bir bash kabuğu komut dosyasına nasıl dosya dahil edileceğini" Google'da yığın taşmasına bağlantı göstererek site trafiğini ve görünürlüğü artıracağını anlıyorsunuz. = D
Mechaflash

3
Sen akıllısın! Muhteşemliğiniz için teşekkürler!
Mechaflash 01

4
@Troubadour, tam olarak sayfaya nasıl ulaştığım zaman kullanıcının cevap için Google'da arama yapması gerektiği yorumunu yapmak aptalca. Örneğin, bugün bu özel soru, "bash include file" için en iyi Google sonucuydu. Başka bir çözüm bulmak için bu cevabı atlamalı mıyım?
lwitzel

Yanıtlar:


193

Basitçe senaryonuzun içine koyun:

source FILE

Veya

. 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
Bunu not et . POSIX uyumlu, kaynak değil
Mathieu_Du

Ancak buradaki kaynak, Cdilde yaptığımızla tam olarak aynı değildir . Burada kaynak alt betiği ana betiğe çalıştırıyor. Ya alt komut dosyasından belirli bir işlevi çağırmak istersem?
Paresh Mayani

8
Karıştırmayın . script.shile ./script.sh. Neler olduğunu anlamaya çalışırken saatlerimi kaybettim
Tihomir Mitkov

Süre . POSIX uyumludur, yani sh, dash, zsh ve diğer POSIX kabuklarında çalışacaktır. Kullanması daha iyi. Bazı kabukların kendilerine ait, benzer, ancak uygulamanızı bozabilecek biraz farklı "kaynak" sürümü olduğundan.
Jacob Korba

52

Yukarıdaki cevaplar doğrudur, ancak betiği başka bir klasörde çalıştırırsanız bazı problemler olacaktır.

Örneğin, a.shve b.shaynı klasörde, dahil edilecek bir b ile birlikte . ./b.sh.

Klasörün dışına komut dosyası çalıştırdığınızda, örneğin xx/xx/xx/a.sh, dosya b.shbulunamadı olmaz: ./b.sh: No such file or directory.

kullanırım

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

33

Evet, kaynağı veya kısa biçimi kullanın .:

. other_script.sh

3
Bash'in yanı sıra .sürümün de çalıştığını unutmayın sh. "Kaynak" olan yalnızca Bash'de çalışır.
Sridhar Sarnobat

2

Benim durumumda color.shaynı dizinden dahil etmek için init.shaşağıdaki gibi bir şey yapmam gerekiyordu.

. ./color.sh

Neden ./ve color.shdoğrudan olmadığından emin değilim . İçeriği color.shaşağıdaki gibidir.

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

Kullanmak File color.shhata vermez ancak renk görüntülenmez. Bunu içinde test ettim Ubuntu 18.04ve Bashsürümü:

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


Bu size sadece mevcut çalışma dizininizdeki dosyayı verir, bulunduğu dizini değil init.sh( ./init.shilk başta başlattıysanız çakışırlar ).
ricab

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.