Làm thế nào tốt nhất để bao gồm các kịch bản khác?


353

Cách bạn thường bao gồm một tập lệnh là với "nguồn"

ví dụ:

chính.sh:

#!/bin/bash

source incl.sh

echo "The main script"

inc.sh:

echo "The included script"

Đầu ra của việc thực thi "./main.sh" là:

The included script
The main script

... Bây giờ, nếu bạn cố gắng thực thi tập lệnh shell đó từ một vị trí khác, nó không thể tìm thấy bao gồm trừ khi nó nằm trong đường dẫn của bạn.

Cách tốt để đảm bảo rằng tập lệnh của bạn có thể tìm thấy tập lệnh bao gồm, đặc biệt nếu, ví dụ, tập lệnh cần phải có khả năng di động?



1
Câu hỏi của bạn rất hay và nhiều thông tin đến nỗi câu hỏi của tôi đã được trả lời trước khi bạn hỏi câu hỏi của bạn! Công việc tốt!
Gabriel Staples

Câu trả lời:


229

Tôi có xu hướng làm cho tất cả các kịch bản của tôi có liên quan với nhau. Bằng cách đó tôi có thể sử dụng dirname:

#!/bin/sh

my_dir="$(dirname "$0")"

"$my_dir/other_script.sh"

5
Điều này sẽ không hoạt động nếu tập lệnh được thực thi thông qua $ PATH. sau đó which $0sẽ hữu ích
Hugo

41
Không có cách nào đáng tin cậy để xác định vị trí của tập lệnh shell, xem mywiki.wooledge.org/BashFAQ/028
Philipp

12
@Philipp, Tác giả của mục đó là chính xác, nó phức tạp và có gotchas. Nhưng nó thiếu một số điểm chính, đầu tiên, tác giả giả định rất nhiều điều về những gì bạn sẽ làm với kịch bản bash của bạn. Tôi sẽ không mong đợi một kịch bản python chạy mà không phụ thuộc vào nó. Bash là một ngôn ngữ keo cho phép bạn làm mọi thứ một cách nhanh chóng mà khó khăn. Khi bạn cần hệ thống xây dựng của mình hoạt động, tính thực dụng (Và một cảnh báo hay về kịch bản không thể tìm thấy phụ thuộc) sẽ thắng.
Aaron H.

11
Chỉ cần tìm hiểu về BASH_SOURCEmảng và cách phần tử đầu tiên trong mảng này luôn trỏ đến nguồn hiện tại.
haridsv

6
Điều này sẽ không hoạt động nếu các tập lệnh là vị trí khác nhau. ví dụ: /home/me/main.sh gọi /home/me/test/inc.sh vì dirname sẽ trở lại / home / me. câu trả lời sacii bằng BASH_SOURCE là một giải pháp tốt hơn stackoverflow.com/a/12694189/1000011
quangyclic

187

Tôi biết tôi đến bữa tiệc muộn, nhưng điều này sẽ hoạt động cho dù bạn bắt đầu tập lệnh như thế nào và chỉ sử dụng nội dung:

DIR="${BASH_SOURCE%/*}"
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
. "$DIR/incl.sh"
. "$DIR/main.sh"

.Lệnh (dot) là một bí danh source, $PWDlà Đường dẫn cho Thư mục làm việc, BASH_SOURCElà một biến mảng có các thành viên là tên tệp nguồn, ${string%substring}dải ngắn nhất của chuỗi con $ từ phía sau chuỗi $


7
Đây là câu trả lời duy nhất trong chuỗi liên tục làm việc cho tôi
Justin

3
@sacii Tôi có thể biết khi nào là dòng if [[ ! -d "$DIR" ]]; then DIR="$PWD"; ficần thiết? Tôi có thể tìm thấy một nhu cầu cho nó nếu các lệnh đang được dán vào dấu nhắc bash để chạy. Tuy nhiên, nếu chạy bên trong một bối cảnh tệp tập lệnh, tôi không thể thấy sự cần thiết của nó ...
Johnny Wong

2
Cũng đáng lưu ý rằng nó hoạt động như mong đợi trên nhiều sources (ý tôi là, nếu bạn sourcelà một tập lệnh sourcekhác trong thư mục khác, v.v., nó vẫn hoạt động).
Ciro Costa

4
Không phải đây là ${BASH_SOURCE[0]}như bạn chỉ muốn được gọi mới nhất? Ngoài ra, sử dụng DIR=$(dirname ${BASH_SOURCE[0]})sẽ cho phép bạn thoát khỏi if-condition
kshenoy 14/07/2016

1
Bạn có sẵn sàng cung cấp đoạn mã này theo giấy phép không cần thuộc tính, như Muff hoặc chỉ phát hành nó vào phạm vi công cộng không? Tôi muốn sử dụng nguyên văn này nhưng thật khó chịu khi đặt thuộc tính lên hàng đầu của mỗi tập lệnh!
BeeOnRope

52

Một thay thế cho:

scriptPath=$(dirname $0)

Là:

scriptPath=${0%/*}

.. lợi thế là không phụ thuộc vào dirname, đây không phải là lệnh tích hợp (và không phải lúc nào cũng có sẵn trong trình giả lập)


2
basePath=$(dirname $0)đã cho tôi giá trị trống khi tệp script chứa có nguồn gốc.
nguyện

41

Nếu nó nằm trong cùng thư mục bạn có thể sử dụng dirname $0:

#!/bin/bash

source $(dirname $0)/incl.sh

echo "The main script"

2
Hai cạm bẫy: 1) $0./t.shvà trả về dirname .; 2) sau khi cd bintrả lại .là không chính xác. $BASH_SOURCEkhông tốt hơn
18446744073709551615

một cạm bẫy khác: hãy thử điều này với khoảng trắng trong tên thư mục.
Hubert Grzeskowiak

source "$(dirname $0)/incl.sh"hoạt động cho những trường hợp đó
dsm

27

Tôi nghĩ cách tốt nhất để làm điều này là sử dụng cách của Chris Boran, NHƯNG bạn nên tính MY_DIR theo cách này:

#!/bin/sh
MY_DIR=$(dirname $(readlink -f $0))
$MY_DIR/other_script.sh

Để trích dẫn các trang man cho readlink:

readlink - display value of a symbolic link

...

  -f, --canonicalize
        canonicalize  by following every symlink in every component of the given 
        name recursively; all but the last component must exist

Tôi chưa bao giờ gặp phải trường hợp sử dụng MY_DIRkhông được tính toán chính xác. Nếu bạn truy cập tập lệnh của mình thông qua một liên kết tượng trưng $PATHthì nó sẽ hoạt động.


Giải pháp hay và đơn giản, và hoạt động nổi tiếng đối với tôi trong nhiều biến thể của lời mời kịch bản mà tôi có thể nghĩ ra. Cảm ơn.
Brian Cline

Ngoài các vấn đề với dấu ngoặc kép bị thiếu, có trường hợp sử dụng thực tế nào mà bạn muốn giải quyết các liên kết tượng trưng thay vì sử dụng $0trực tiếp không?
l0b0

1
@ l0b0: Hãy tưởng tượng tập lệnh của bạn là /home/you/script.shBạn có thể cd /homevà chạy tập lệnh của bạn từ đó vì ./you/script.shtrong trường hợp dirname $0này sẽ trả về ./youvà bao gồm tập lệnh khác sẽ thất bại
dr.scre

1
Tuy nhiên, gợi ý tuyệt vời, tôi cần phải làm như sau để nó đọc các biến của tôi trong ` MY_DIR=$(dirname $(readlink -f $0)); source $MY_DIR/incl.sh
Frederick Ollinger

21

Một sự kết hợp của các câu trả lời cho câu hỏi này cung cấp giải pháp mạnh mẽ nhất.

Nó đã làm việc cho chúng tôi trong các kịch bản cấp sản xuất với sự hỗ trợ tuyệt vời của các phụ thuộc và cấu trúc thư mục:

#! / bin / bash

# Đường dẫn đầy đủ của tập lệnh hiện tại
NÀY = `readlink -f" $ {BASH_SOURCE [0]} "2> / dev / null || echo $ 0`

# Thư mục chứa tập lệnh hiện tại
DIR = `dirname" $ ​​{NÀY} "`

# 'Dot' có nghĩa là 'nguồn', tức là 'bao gồm':
. "$ TRỰC TIẾP / biên dịch.sh"

Phương pháp hỗ trợ tất cả những điều này:

  • Không gian trong đường dẫn
  • Liên kết (thông qua readlink)
  • ${BASH_SOURCE[0]} mạnh hơn $0

1
NÀY = readlink -f "${BASH_SOURCE[0]}" 2>/dev/null||echo $0 nếu đường dẫn của bạn là BusyBox v1.01
Alexx Roche

@AlexxRoche cảm ơn bạn! Điều này sẽ hoạt động trên tất cả các Linux?
Brian Haak

1
Tôi mong đợi như vậy. Có vẻ như hoạt động trên Debian Sid 3.16 và armv5tel 3.4.6 Linux của QNAP.
Alexx Roche

2
Tôi đặt nó trong một dòng này:DIR=$(dirname $(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null||echo $0)) # https://stackoverflow.com/a/34208365/
Acumenus

20
SRC=$(cd $(dirname "$0"); pwd)
source "${SRC}/incl.sh"

1
Tôi nghi ngờ rằng bạn đã bỏ phiếu cho "cd ..." khi dirname "$ 0" sẽ hoàn thành điều tương tự ...
Aaron H.

7
Mã này sẽ trả về đường dẫn tuyệt đối ngay cả khi tập lệnh được thực thi từ thư mục hiện tại. $ (dirname "$ 0") sẽ chỉ trả về "."
Tối đa

1
./incl.shgiải quyết theo cùng một đường dẫn là cd+ pwd. Vậy lợi thế của việc thay đổi thư mục là gì?
l0b0

Đôi khi bạn cần đường dẫn tuyệt đối của tập lệnh, ví dụ khi bạn phải thay đổi thư mục qua lại.
Laryx Decidua

15

Điều này hoạt động ngay cả khi tập lệnh có nguồn gốc:

source "$( dirname "${BASH_SOURCE[0]}" )/incl.sh"

Bạn có thể giải thích mục đích của "[0]" là gì không?
Ray

1
@Ray BASH_SOURCElà một mảng các đường dẫn, tương ứng với một ngăn xếp cuộc gọi. Phần tử đầu tiên tương ứng với tập lệnh gần đây nhất trong ngăn xếp, đó là tập lệnh hiện đang thực thi. Trên thực tế, $BASH_SOURCEđược gọi là một biến mở rộng thành phần tử đầu tiên của nó theo mặc định, vì vậy [0]không cần thiết ở đây. Xem liên kết này để biết chi tiết.
Jonathan H

10

1. gọn gàng nhất

Tôi đã khám phá hầu hết mọi đề xuất và đây là gợi ý gọn gàng nhất phù hợp với tôi:

script_root=$(dirname $(readlink -f $0))

Nó hoạt động ngay cả khi tập lệnh được liên kết với một $PATHthư mục.

Xem nó trong hành động ở đây: https://github.com/pendashteh/hcagent/blob/master/bin/hcagent

2. Tuyệt nhất

# Copyright https://stackoverflow.com/a/13222994/257479
script_root=$(ls -l /proc/$$/fd | grep "255 ->" | sed -e 's/^.\+-> //')

Đây thực sự là từ một câu trả lời khác trên chính trang này, nhưng tôi cũng đang thêm nó vào câu trả lời của mình!

2. Đáng tin cậy nhất

Ngoài ra, trong trường hợp hiếm hoi mà những người đó không làm việc, đây là phương pháp chống đạn:

# Copyright http://stackoverflow.com/a/7400673/257479
myreadlink() { [ ! -h "$1" ] && echo "$1" || (local link="$(expr "$(command ls -ld -- "$1")" : '.*-> \(.*\)$')"; cd $(dirname $1); myreadlink "$link" | sed "s|^\([^/].*\)\$|$(dirname $1)/\1|"); }
whereis() { echo $1 | sed "s|^\([^/].*/.*\)|$(pwd)/\1|;s|^\([^/]*\)$|$(which -- $1)|;s|^$|$1|"; } 
whereis_realpath() { local SCRIPT_PATH=$(whereis $1); myreadlink ${SCRIPT_PATH} | sed "s|^\([^/].*\)\$|$(dirname ${SCRIPT_PATH})/\1|"; } 

script_root=$(dirname $(whereis_realpath "$0"))

Bạn có thể thấy nó hoạt động trong taskrunnernguồn: https://github.com/pendashteh/taskrunner/blob/master/bin/taskrunner

Hy vọng điều này sẽ giúp ai đó ngoài kia :)

Ngoài ra, vui lòng để lại nhận xét nếu một người không làm việc cho bạn và đề cập đến hệ điều hành và trình giả lập của bạn. Cảm ơn!


7

Bạn cần xác định vị trí của các tập lệnh khác, không có cách nào khác xung quanh nó. Tôi muốn giới thiệu một biến cấu hình ở đầu tập lệnh của bạn:

#!/bin/bash
installpath=/where/your/scripts/are

. $installpath/incl.sh

echo "The main script"

Ngoài ra, bạn có thể nhấn mạnh rằng người dùng duy trì một biến môi trường cho biết nhà chương trình của bạn đang ở đâu, như PROG_HOME hoặc somesuch. Điều này có thể được cung cấp cho người dùng tự động bằng cách tạo tập lệnh với thông tin đó trong /etc/profile.d/, sẽ được cung cấp mỗi khi người dùng đăng nhập.


1
Tôi đánh giá cao mong muốn về tính đặc hiệu, nhưng tôi không thể hiểu tại sao cần phải có đường dẫn đầy đủ trừ khi các tập lệnh bao gồm là một phần của gói khác. Tôi không thấy sự khác biệt về bảo mật đang tải từ một đường dẫn tương đối cụ thể (nghĩa là cùng một thư mục nơi tập lệnh đang thực thi.) So với một đường dẫn đầy đủ cụ thể. Tại sao bạn nói không có cách nào xung quanh nó?
Aaron H.

4
Bởi vì thư mục nơi tập lệnh của bạn đang thực thi không nhất thiết là nơi tập lệnh bạn muốn đưa vào tập lệnh của bạn được đặt. Bạn muốn tải các tập lệnh nơi chúng được cài đặt tại và không có cách nào đáng tin cậy để biết nơi đó đang ở thời gian chạy. Không sử dụng một vị trí cố định cũng là một cách tốt để bao gồm tập lệnh sai (tức là hacker cung cấp) và chạy nó.
Steve Baker

6

Tôi khuyên bạn nên tạo một tập lệnh setenv với mục đích duy nhất là cung cấp vị trí cho các thành phần khác nhau trên hệ thống của bạn.

Tất cả các tập lệnh khác sau đó sẽ lấy tập lệnh này để tất cả các vị trí đều phổ biến trên tất cả các tập lệnh sử dụng tập lệnh setenv.

Điều này rất hữu ích khi chạy cronjobs. Bạn nhận được một môi trường tối thiểu khi chạy cron, nhưng nếu bạn tạo tất cả các tập lệnh cron trước tiên bao gồm tập lệnh setenv thì bạn có thể kiểm soát và đồng bộ hóa môi trường mà bạn muốn các cronjob thực thi.

Chúng tôi đã sử dụng một kỹ thuật như vậy trên con khỉ xây dựng của chúng tôi được sử dụng để tích hợp liên tục trong một dự án khoảng 2.000 kSLOC.


3

Trả lời của Steve chắc chắn là kỹ thuật chính xác nhưng nó cần được cấu trúc lại để biến installpath của bạn nằm trong một tập lệnh môi trường riêng biệt nơi tất cả các khai báo như vậy được thực hiện.

Sau đó, tất cả các tập lệnh nguồn script đó và nên installpath thay đổi, bạn chỉ cần thay đổi nó ở một vị trí. Làm cho mọi thứ nhiều hơn, er, Futureproof. Chúa tôi ghét từ đó! (-:

BTW Bạn thực sự nên tham khảo biến bằng cách sử dụng $ {installpath} khi sử dụng nó theo cách hiển thị trong ví dụ của bạn:

. ${installpath}/incl.sh

Nếu niềng răng bị bỏ lại, một số shell sẽ thử và mở rộng biến "installpath / incl.sh"!


3

Shell Script Loader là giải pháp của tôi cho việc này.

Nó cung cấp một hàm có tên bao gồm () có thể được gọi nhiều lần trong nhiều tập lệnh để chỉ một tập lệnh nhưng sẽ chỉ tải tập lệnh một lần. Hàm có thể chấp nhận đường dẫn hoàn chỉnh hoặc đường dẫn một phần (tập lệnh được tìm kiếm trong đường dẫn tìm kiếm). Một hàm tương tự có tên là load () cũng được cung cấp sẽ tải các tập lệnh vô điều kiện.

Nó hoạt động cho bash , ksh , pd kshzsh với các tập lệnh được tối ưu hóa cho mỗi một trong số chúng; và các shell khác tương thích chung với sh gốc như tro , dash , gia truyền sh , v.v., thông qua một tập lệnh phổ biến tự động tối ưu hóa các chức năng của nó tùy thuộc vào các tính năng mà shell có thể cung cấp.

[Ví dụ cho thấy]

bắt đầu

Đây là một kịch bản khởi động tùy chọn. Đặt các phương thức khởi động ở đây chỉ là một sự thuận tiện và có thể được đặt trong kịch bản chính thay thế. Kịch bản này cũng không cần thiết nếu các kịch bản được biên dịch.

#!/bin/sh

# load loader.sh
. loader.sh

# include directories to search path
loader_addpath /usr/lib/sh deps source

# load main script
load main.sh

chính

include a.sh
include b.sh

echo '---- main.sh ----'

# remove loader from shellspace since
# we no longer need it
loader_finish

# main procedures go from here

# ...

tro

include main.sh
include a.sh
include b.sh

echo '---- a.sh ----'

b.sh

include main.sh
include a.sh
include b.sh

echo '---- b.sh ----'

đầu ra:

---- b.sh ----
---- a.sh ----
---- main.sh ----

Điều tốt nhất là các tập lệnh dựa trên nó cũng có thể được biên dịch để tạo thành một tập lệnh duy nhất với trình biên dịch có sẵn.

Đây là một dự án sử dụng nó: http://sourceforge.net/p/playshell/code/ci/master/tree/ . Nó có thể chạy một cách hợp lý có hoặc không biên dịch các tập lệnh. Việc biên dịch để tạo ra một tập lệnh cũng có thể xảy ra và rất hữu ích trong quá trình cài đặt.

Tôi cũng đã tạo một nguyên mẫu đơn giản hơn cho bất kỳ bên bảo thủ nào có thể muốn có một ý tưởng ngắn gọn về cách tập lệnh triển khai hoạt động: https://sourceforge.net/p/loader/code/ci/base/tree/loader-include-prototype .bash . Nó nhỏ và bất kỳ ai cũng có thể bao gồm mã trong tập lệnh chính của họ nếu họ muốn nếu mã của họ có ý định chạy với Bash 4.0 hoặc mới hơn và nó cũng không sử dụng eval.


3
12 kilobyte của tập lệnh Bash chứa hơn 100 dòng evalmã ed để tải phụ thuộc. Ouch
l0b0

1
Chính xác một trong ba evalkhối gần phía dưới luôn luôn chạy. Vì vậy, cho dù nó cần thiết hay không, nó chắc chắn đang sử dụng eval.
l0b0

3
Cuộc gọi eval đó là an toàn và nó không được sử dụng nếu bạn có Bash 4.0+. Tôi hiểu rồi, bạn là một trong những nhà viết kịch bản thời xưa nghĩ rằng đó evallà tà ác thuần túy và không biết cách tận dụng nó một cách tốt đẹp.
konsolebox

1
Tôi không biết ý của bạn là "không được sử dụng", nhưng nó được chạy. Và sau vài năm viết kịch bản shell như một phần công việc của tôi, vâng, tôi bị thuyết phục hơn bao giờ hết eval.
l0b0

1
Hai cách đơn giản, di động để gắn cờ các tệp xuất hiện ngay lập tức: Tham chiếu đến chúng bằng số inode của chúng hoặc bằng cách đặt các đường dẫn được phân tách bằng NUL vào một tệp.
l0b0

2

Cá nhân đặt tất cả các thư viện trong một libthư mục và sử dụng một importchức năng để tải chúng.

cấu trúc thư mục

nhập mô tả hình ảnh ở đây

script.sh nội dung

# Imports '.sh' files from 'lib' directory
function import()
{
  local file="./lib/$1.sh"
  local error="\e[31mError: \e[0mCannot find \e[1m$1\e[0m library at: \e[2m$file\e[0m"
  if [ -f "$file" ]; then
     source "$file"
    if [ -z $IMPORTED ]; then
      echo -e $error
      exit 1
    fi
  else
    echo -e $error
    exit 1
  fi
}

Lưu ý rằng chức năng nhập này phải ở đầu tập lệnh của bạn và sau đó bạn có thể dễ dàng nhập các thư viện của mình như thế này:

import "utils"
import "requirements"

Thêm một dòng duy nhất ở đầu mỗi thư viện (ví dụ utils.sh):

IMPORTED="$BASH_SOURCE"

Bây giờ bạn có quyền truy cập vào các chức năng bên trong utils.shrequirements.shtừscript.sh

TODO: Viết một trình liên kết để xây dựng một shtệp duy nhất


Điều này cũng giải quyết vấn đề thực thi tập lệnh bên ngoài thư mục mà nó đang ở?
Aaron H.

@AaronH. Không. Đó là một cách có cấu trúc để bao gồm các phụ thuộc trong các dự án lớn.
Xaqron

1

Sử dụng nguồn hoặc $ 0 sẽ không cung cấp cho bạn đường dẫn thực sự của tập lệnh của bạn. Bạn có thể sử dụng id quá trình của tập lệnh để lấy đường dẫn thực của nó

ls -l       /proc/$$/fd           | 
grep        "255 ->"            |
sed -e      's/^.\+-> //'

Tôi đang sử dụng tập lệnh này và nó luôn phục vụ tốt cho tôi :)


1

Tôi đặt tất cả các tập lệnh khởi động của tôi trong một thư mục .bashrc.d. Đây là một kỹ thuật phổ biến ở những nơi như /etc/profile.d, v.v.

while read file; do source "${file}"; done <<HERE
$(find ${HOME}/.bashrc.d -type f)
HERE

Vấn đề với giải pháp sử dụng Globing ...

for file in ${HOME}/.bashrc.d/*.sh; do source ${file};done

... là bạn có thể có một danh sách tập tin "quá dài". Một cách tiếp cận như ...

find ${HOME}/.bashrc.d -type f | while read file; do source ${file}; done

... Chạy nhưng không thay đổi môi trường như mong muốn.


1

Tất nhiên, với mỗi người của họ, nhưng tôi nghĩ rằng khối bên dưới là khá vững chắc. Tôi tin rằng điều này liên quan đến cách "tốt nhất" để tìm thư mục và cách "tốt nhất" để gọi một tập lệnh bash khác:

scriptdir=`dirname "$BASH_SOURCE"`
source $scriptdir/incl.sh

echo "The main script"

Vì vậy, đây có thể là cách "tốt nhất" để bao gồm các tập lệnh khác. Điều này dựa trên một câu trả lời "tốt nhất" khác cho biết tập lệnh bash nơi nó được lưu trữ


1

Điều này sẽ làm việc đáng tin cậy:

source_relative() {
 local dir="${BASH_SOURCE%/*}"
 [[ -z "$dir" ]] && dir="$PWD"
 source "$dir/$1"
}

source_relative incl.sh

0

chúng ta chỉ cần tìm ra thư mục lưu trữ inc.sh và main.sh của chúng ta; chỉ cần thay đổi main.sh của bạn với điều này:

chính

#!/bin/bash

SCRIPT_NAME=$(basename $0)
SCRIPT_DIR="$(echo $0| sed "s/$SCRIPT_NAME//g")"
source $SCRIPT_DIR/incl.sh

echo "The main script"

Không chính xác trích dẫn, sử dụng không cần thiết của echo, và sử dụng không đúng sed's glựa chọn. -1.
l0b0

Dù sao, để có được kịch bản này, hãy làm: SCRIPT_DIR=$(echo "$0" | sed "s/${SCRIPT_NAME}//")và sau đósource "${SCRIPT_DIR}incl.sh"
Krzysiek

0

Theo man hiernơi phù hợp cho kịch bản bao gồm là/usr/local/lib/

/ usr / địa phương / lib

Các tập tin liên quan đến các chương trình được cài đặt cục bộ.

Cá nhân tôi thích /usr/local/lib/bash/includesbao gồm. Có lib bash-helper để bao gồm lib theo cách đó:

#!/bin/bash

. /usr/local/lib/bash/includes/bash-helpers.sh

include api-client || exit 1                   # include shared functions
include mysql-status/query-builder || exit 1   # include script functions

# include script functions with status message
include mysql-status/process-checker; status 'process-checker' $? || exit 1
include mysql-status/nonexists; status 'nonexists' $? || exit 1

bash-helpers bao gồm đầu ra trạng thái


-5

Bạn cũng có thể dùng:

PWD=$(pwd)
source "$PWD/inc.sh"

9
Bạn cho rằng bạn đang ở trong cùng thư mục chứa tập lệnh. Nó sẽ không hoạt động nếu bạn ở một nơi khác.
Lục M
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.