2015-04-17 24 views
5

Tôi đã tạo một tập lệnh Tcl cho phép tôi tự động cài đặt phần mềm. Nhưng vấn đề tôi đang gặp phải là phần mềm cần một số biến môi trường được đặt trước và tôi đã tự hỏi liệu có thể thiết lập các biến môi trường bên trong kịch bản lệnh tcl hay không.Đặt biến môi trường từ bên trong tập lệnh TCL

Tôi sẽ cố gắng exec /bin/sh -c "source /path/to/.bash_profile nhưng điều đó sẽ tạo tập lệnh trình bao và nguồn biến vào đó và tập lệnh tcl sẽ không tải lên.

Có ai có thể đưa ra bất kỳ ý tưởng nào khác không?

Trả lời

3

Trong Tcl bạn có toàn cầu env mảng:

set ::env(foo) bar 

Và sau đó bất kỳ quá trình đứa trẻ có biến foo trong môi trường của nó.

Nếu bạn muốn đặt biến môi trường trong một file trung ương (ví dụ: .bash_profile) để các chương trình khác có thể nguồn họ, sau đó nó nên được khá dễ dàng để có được Tcl để phân tích tập tin đó và thiết lập các biến trong mảng env.

3

Nói chung (ít nhất là đối với các hệ thống giống như Linux và Unix), không thể thực hiện được từ bên trong một tiến trình con để thay đổi môi trường của cha mẹ. Đó là frequently asked question about tcl

Tuy nhiên, nếu bạn khởi chạy một số phần mềm khác từ bên trong tập lệnh Tcl, bạn có thể thực hiện một vài điều, cách đơn giản nhất có thể là tạo tệp tập lệnh shell. khởi chạy phần mềm của bạn. Sau đó chạy script shell từ bên trong Tcl.

+1

nếu tôi muốn đặt biến môi trường của chính quy trình con? Vì vậy, biến môi trường của tập lệnh tcl đang chạy – Attiq

0

Môi trường được hiển thị thông qua mảng toàn cầu env trong Tcl. Các khóa và giá trị của mảng mặc định với môi trường thừa hưởng từ tiến trình cha, bất kỳ quá trình nào mà Tcl tạo sẽ kế thừa bản sao của nó và mã kiểm tra môi trường trong quy trình hiện tại (bao gồm trực tiếp từ C) sẽ thấy trạng thái hiện tại của nó.

Việc chọn môi trường được đặt trong tập lệnh shell khá phức tạp. Vấn đề là một .bashrc (ví dụ) có thể làm những điều khá phức tạp cũng như thiết lập một loạt các biến môi trường. Ví dụ, nó cũng có thể in ra một tin nhắn trong ngày, hoặc có điều kiện hành động. Nhưng bạn ít nhất có thể làm cho một nỗ lực bằng cách sử dụng env lệnh của shell:

set data [exec sh -c "source /path/to/file.sh.rc; env"] 
# Now we parse with some regular expression magic 
foreach {- key value} [regexp -all -inline {(?wi)^(\w+)=((?!')[^\n]+|'[^']+')$} $data] { 
    set extracted_env($key) [string trim $value "'"] 
} 

Nó khá khủng khiếp, và không phải là khá bên phải (có những điều mà có thể nhầm lẫn nó) nhưng nó khá gần . Các giá trị sẽ được điền trong mảng extracted_env.

Tôi nghĩ mọi người dễ dàng định cấu hình mọi thứ thông qua tập lệnh Tcl…

+0

hmm 'env' sẽ tốt hơn' set' để nhận các biến môi trường. 'set' cũng tách ra các hàm và các biến shell đơn giản. –

+0

@glennjackman Không biết rằng 'env' có thể sử dụng được cho điều đó. –

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