Tôi có hai tập lệnh tcl. Và tôi muốn chạy kịch bản thứ hai khi lần đầu tiên kết thúc. Tôi làm nó như thế nào?Làm cách nào để chạy tập lệnh tcl trong tập lệnh tcl khác?
Trả lời
Phụ thuộc vào ý bạn thực sự là gì.
Một cách là viết một ("bậc thầy") kịch bản thứ ba mà có thể làm
source /the/path/to/the/first.tcl
source /the/path/to/the/second.tcl
Một cách khác là chỉ cần thêm các cuộc gọi thứ hai để source
từ ví dụ trên để dưới cùng của kịch bản đầu tiên.
Sửa đổi phương pháp tiếp cận đầu tiên: nếu kịch bản được thực hiện đều nằm trong cùng thư mục như kịch bản tổng thể, một cách thành ngữ để source
họ là
set where [file dirname [info script]]
source [file join $where first.tcl]
source [file join $where second.tcl]
Bằng cách này tìm nguồn cung ứng sẽ làm việc không có vấn đề gì thư mục của tiến trình hiện tại là và vị trí của thư mục dự án.
Bạn chỉ cần sử dụng nguồn để chạy tập lệnh thứ hai.
source "/tmp/whatever.tcl"
Trong khi đây thường là câu trả lời đúng, vì câu hỏi không được xây dựng chính xác, có nhiều cách để đạt được mục tiêu chạy mã tcl từ bên trong tcl. Tôi không thể hiểu chi tiết về điều này, bởi vì hiểu được việc thực thi mã là một điểm chính trong việc hiểu tcl số mười hai của nó.
Có nguồn
Lệnh nguồn không nên lộn xộn với thực hiện kịch bản một cách cổ điển, những gì tôi nghĩ rằng khởi động chủ đề đã yêu cầu.
Lệnh nguồn giống như lệnh "include" trong c/perl/php. Các ngôn ngữ như java hoặc python mặt khác chỉ có cơ chế "nhập".
Sự khác biệt là các ngôn ngữ đó tạo cơ sở dữ liệu nội bộ của các gói sẵn có, được liên kết với các tệp nguồn/nhị phân/bytecode tương ứng. Bằng cách viết một câu lệnh nhập khẩu, các tệp được liên kết hoặc nguồn byte hoặc tệp nhị phân được tải. Điều này cho phép quản lý phụ thuộc sâu hơn mà không cần viết mã bổ sung. Trong tcl, điều này có thể đạt được với các không gian tên và gói yêu cầu lệnh. Ví dụ:
Giả sử bạn có source.tcl này:
proc foo {bar} {puts "baz"}
set BAM "BOO"
Bây giờ, bạn có "bậc thầy" của bạn kịch bản như bạn gọi nó. Tôi gọi nó là "chính". Nó có các nội dung:
set BAM {my important data}
source source.tcl
#also the function foo can now be used, becouse source reads the whole script
foo {wuz}
set BAM
#will output "BOO"
Lệnh exec
Nếu bạn có thể sống với chi phí bổ sung bắt đầu từ một trường hợp phiên dịch hoàn toàn mới bạn có thể cũng làm:
set BAM {my important data}
exec tclsh source.tcl
#The variable BAM will not be modified. You can not use the function foo.
Lệnh eval
Đánh giá có thể đánh giá một chuỗi hoặc một danh sách (trong tất cả mọi thứ tcl là một chuỗi) giống như nó sẽ được lập trình mã. Bạn sẽ phải tải tệp nguồn hoàn chỉnh vào một chuỗi. Và sau đó sử dụng eval, để đánh giá mã trong một phạm vi tách biệt, để không ghi đè lên nội dung trong tệp nguồn chính của bạn.
set fp [open "somefile" r]
set code_string [read $fp]
close $fp
eval $code_string