2017-08-18 44 views
5

Tôi biết rằng source. làm điều tương tự, và tôi sẽ ngạc nhiên khi biết các cặp lệnh khác trong tiêu đề không giống như vậy (vì tôi đang chạy bash như vỏ của tôi, $SHELL [script]bash [script] tương đương, phải không ??).

Vậy sự khác nhau giữa ba phương pháp thực thi tập lệnh là gì? Tôi hỏi vì tôi chỉ biết rằng tìm nguồn cung ứng một kịch bản là NOT the exact same khi thực hiện nó. Theo cách mà tôi không thấy rõ ràng khi chạy "thử nghiệm" của tôi và đọc các trang của người đàn ông.

Những khác biệt tinh tế khác mà tôi không thể tìm thấy bằng cách gọi một cách mù quáng các chức năng này trên các tập lệnh cực kỳ đơn giản mà tôi đã viết là gì? Sau khi đọc câu trả lời được liên kết ở trên, tôi có thể đoán chắc rằng câu trả lời cho câu hỏi của tôi sẽ là một lời giải thích đơn giản, nhưng theo cách mà tôi gần như chưa bao giờ tự mình khám phá đầy đủ.

Dưới đây là các "thí nghiệm" Tôi đã làm:

$. myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$source myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$bash myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$$SHELL myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$./myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

$myScript.sh 
    "This is the output to my script. I'd like to think it's original." 

Trả lời

10

. scriptsource script thực hiện các nội dung của scripttrong môi trường hiện tại, nghĩa là không phải tạo ra một subshell. Ngược lại, điều này cho phép script ảnh hưởng đến môi trường hiện tại, ví dụ như thay đổi biến môi trường hoặc thay đổi thư mục công việc hiện tại. Mặt khác, điều này cho phép script ảnh hưởng đến môi trường hiện tại, đây là một mối nguy hiểm tiềm ẩn về bảo mật.

bash script chuyển script tới thông dịch viên bash để thực thi. Dù shebang được đưa ra bởi script chính nó là bỏ qua. ("Công việc" đề cập đến dòng đầu tiên của script, có thể ví dụ như đọc #!/bin/bash, hoặc #!/usr/bin/perl, hoặc #!/usr/bin/awk, để xác định các thông dịch viên để được sử dụng.)

$SHELL script đi script-bất cứ điều gì là vỏ thông dịch hiện tại của bạn để thi hành. Điều đó có thể, hoặc có thể không, là bash. (Các biến môi trường SHELL giữ tên của thông dịch viên shell hiện tại của bạn. $SHELL, nếu chạy bash, được đánh giá để /bin/bash, với hiệu ứng trình bày chi tiết trong đoạn trước.)

./script thực hiện các nội dung của một tập tin scripttrong thư mục công việc hiện tại. Nếu không có tệp như vậy, lỗi sẽ được tạo. Nội dung của $PATH không ảnh hưởng đến những gì xảy ra.

script tìm kiếm một tập tin scripttrong các thư mục được liệt kê trong $PATH, mà có thể hoặc không có thể bao gồm các thư mục làm việc hiện hành. Số script đầu tiên được tìm thấy trong danh sách thư mục này được thực thi, có thể hoặc không thể là thư mục trong thư mục công việc hiện tại của bạn.

+0

Ahh, cảm ơn bạn! Vì vậy, tôi có thể chạy một trình bao khác (nói, csh), và STILL gọi 'bash [script]'. Phần được thêm vào về shebang rất thú vị! Vì vậy, "$ SHELL [script]" cũng sẽ bỏ qua shebang. Một điều khác mà tôi vừa mới nhận ra là thư mục mà tôi đang sử dụng khi chạy thử nghiệm của tôi là biến $ PATH của tôi. Nếu không, "[script]" chỉ đơn giản là không có tác dụng. Wow.Có rất nhiều sự khác biệt cho một đầu ra tương tự như vậy. –

+1

@AriSweedler: Đúng vậy. Lưu ý rằng một số công cụ * bỏ qua * shell hiện tại của bạn, và mặc định là '/ bin/sh' trừ khi * rõ ràng * được nói cách khác (ví dụ crontab và make). – DevSolar

+1

Ghi chú: 'nguồn' là một Bashism,' .' là POSIX; '$ SHELL' có thể mở rộng đến một cái gì đó khác với shell của bạn (ví dụ:'/bin/bash' khi chạy dấu gạch ngang). –