2011-04-15 45 views
6

Tôi có hai tập lệnh chạy độc lập. đầu tiên cho phép nói rằng tập lệnh A tính toán một số giá trị. Và tôi muốn lặp lại các giá trị này từ kịch bản khác được gọi là B. Các tập lệnh này sẽ không gọi cho nhau. Tôi đã sử dụng từ khóa xuất nhưng không hoạt động. Tôi có thể làm cái này như thế nào?Xuất các biến giữa tập lệnh shell

+1

Sẽ không '. script' làm các trick? (xem http://www.linuxquestions.org/questions/linux-newbie-8/how-to-export-environment-variable-from-a-bash-script-344057/) – mlvljr

+0

@mlvljr Bạn nên làm cho câu trả lời này bởi vì đó là những gì tôi cần. Cảm ơn. – Rebs

+0

@AdamGriffiths Vâng, tôi đang cố gắng tránh cuộc đua điểm danh tiếng ở đây;) – mlvljr

Trả lời

6

Nếu tôi hiểu các yêu cầu sau đó có thể không phải cả hai kịch bản được chỉ đơn giản là thực hiện trong cùng một vỏ tiểu, một cách độc lập nhưng mà không gọi nhau hoặc không có bất kỳ nhu cầu của một tập tin bên ngoài hoặc ống như thế này:

Hãy nói rằng đây là script1.sh bạn

#!/bin/bash 
# script1.sh: do something and finally 
export x=19 

Và đây chúng tôi script2 của bạn.sh

#!/bin/bash 
# script2.sh: read value of $x here 
echo "x="${x} 

Chỉ cần gọi cho họ trong cùng một tiểu vỏ như

(. ./script1.sh && ./script2.sh) 

OUTPUT này:

x=19 
0

Bạn không thể đọc tệp thứ ba, giả sử settings.sh với các biến được xuất phổ biến?

# common.sh 
export MY_PATH=/home/foo/bar/ 
export VERSION=42.2a 

và trong cả A và B source common.sh để tải các giá trị đó.

Lưu ý rằng việc xuất có thể không được yêu cầu trong trường hợp đó.

+0

Tôi không cần tệp thứ ba thực sự. – thetux4

0

Bạn có thể lặp lại các giá trị cho tệp, sau đó tập lệnh khác có thể đọc chúng. Nếu bạn muốn sử dụng nó như là một tham số cho một cái gì đó, sử dụng aposthrophe ngược lại:

echo `cat storedvalue` 

Hãy cẩn thận, nếu hai kịch bản đang chạy cùng một lúc, các vấn đề có thể xảy ra đồng thời, có thể gây hiếm khi xuất hiện, mystic- tìm lỗi.

+0

Vậy làm cách nào tôi có thể chuyển giá trị trả về của tập lệnh A đến tập lệnh B? – thetux4

4
mkfifo /tmp/channel 

process_a.sh > /tmp/channel& 
process_b.sh < /tmp/channel& 

wait 

Tất nhiên bạn cũng có thể chỉ đọc một dòng khi bạn muốn.

Trong bash có coprocs, cũng có thể là những gì bạn muốn. Ví dụ ngẫu nhiên từ this page

# let the output of the coprocess go to stdout 
{ coproc mycoproc { awk '{print "foo" $0;fflush()}' ;} >&3 ;} 3>&1 
echo bar >&${mycoproc[1]} 
foobar 

ksh có một tính năng tương tự, rõ ràng

+0

giao tiếp giữa các quy trình riêng biệt được thực hiện dễ dàng nhất với các tệp và một đường ống được đặt tên cung cấp giao diện giống như tệp: 'A 'FIFO' là loại tệp đặc biệt cho phép các quy trình độc lập giao tiếp.’ –

+0

coproc rất thú vị. tôi sẽ kiểm tra. – thetux4

1

suy nghĩ của mỗi kịch bản như một chức năng: chức năng Một tính toán một số giá trị và trả về nó. Nó không biết ai sẽ gọi nó. Hàm B lấy giá trị và lặp lại nó. Nó không quan tâm ai tạo ra giá trị đó. Vì vậy, kịch bản A là:

#!/bin/sh 
# a.sh: Calculate something and return the result 
echo 19 

và kịch bản B là:

#!/bin/sh 
# b.sh: Consume the calculated result, which passed in as $1 
echo The result is $1 

Làm cho họ thực thi:

chmod +x [ab].sh 

Bây giờ, chúng ta có thể dán chúng lại với nhau trên dòng lệnh:

$ b.sh $(a.sh) 
The result is 19 

Ngữ nghĩa, b.sh di d không gọi a.sh. Bạn gọi a.sh và chuyển kết quả của nó tới b.sh.

0

Trên thực tế tất cả các nhu cầu của bạn là source bạn có thể bỏ tiền tố export.

use-case của tôi là một môi trường cài đặt cụ thể tập tin, ví dụ:

Trong main_script.sh

THIS_DIR=`dirname $0` 
source $THIS_DIR/config_vars.sh 
# other commands 

Trong config_vars.sh

Các vấn đề liên quan