Các cách khác nhau để thực thi nhị phân và tập lệnh


11

Tôi đã sử dụng Linux được một thời gian và tôi đã tìm kiếm một cái nhìn tổng quan hoàn chỉnh về vấn đề này nhưng không tìm thấy.

Tôi chỉ không đồng ý với tất cả các cách khác nhau để thực thi các tập lệnh và nhị phân - tất cả đều là một mớ hỗn độn lớn đối với tôi và tôi phải sử dụng thử và sai để xác định những gì tôi nên sử dụng. Đối với một tệp là tập lệnh hoặc tệp nhị phân <script/binary>, tôi có thể đưa ra các lựa chọn thay thế sau:

<script/binary>
. <script/binary>
./<script/binary>
source <script/binary>
sh <script/binary>

(Có nhiều không?)

Ai đó có thể cung cấp một cái nhìn tổng quan hoàn chỉnh về các lệnh làm việc với loại tệp nào và sự khác biệt là gì khi có nhiều tùy chọn không?

Cảm ơn.

Câu trả lời:


7

Các lệnh sau là như nhau, một thành phần dấu chấm có nghĩa là "thư mục hiện tại". Để cho phép được thực thi, các tệp cần phải có quyền thực thi:

path/to/binary
./path/to/binary

Lưu ý rằng nếu một đường dẫn không chứa dấu gạch chéo, thì nó được coi là một lệnh (có thể là một shell được tích hợp sẵn hoặc một chương trình được tra cứu trong $PATHbiến môi trường).

Các mục sau đây gần giống nhau, chúng thực thi một tập lệnh shell (không phải là nhị phân!) Trong môi trường shell hiện tại. Một sự khác biệt nhỏ giữa hai dòng được mô tả trong câu hỏi Unix.SE này .

. path/to/script
source path/to/script

Cuối cùng bạn đã đề cập sh script. Một lần nữa, điều này chỉ hoạt động cho các kịch bản shell và không nhị phân. Về cơ bản, bạn đang thực hiện shchương trình với tên script là đối số. Trong trường hợp sh, nó chỉ coi đối số này là shell script và thực thi nó.

Để biết câu trả lời bị giới hạn trong shellscripts, hãy xem Các cách khác nhau để thực thi tập lệnh shell .


3

Cám ơn vì tất cả đóng góp. Tôi sẽ cố gắng trả lời câu hỏi của riêng tôi bây giờ và cung cấp một hướng dẫn đầy đủ cho các khả năng khác nhau để thực thi các tập lệnh và nhị phân. Vui lòng chỉnh sửa và nhận xét và chúng tôi sẽ có thể đưa ra một cái gì đó đầy đủ và chính xác. Đây là gợi ý của tôi:

Đầu tiên, hai điểm để nêu:

  • Linux tạo ra sự khác biệt giữa một lệnh và một đường dẫn . Một lệnh chỉ được gõ như trên dấu nhắc và sẽ thực thi lệnh tích hợp hoặc sẽ khiến Linux tìm kiếm một tệp nhị phân hoặc tập lệnh tương ứng trên $ PATH.

  • Để Linux diễn giải một cái gì đó như một đường dẫn, nó cần chứa ít nhất một dấu gạch chéo (/). Ví dụ ./myScript, ./có vẻ khá dư thừa - chỉ có điều khiến Linux diễn giải nó như một đường dẫn chứ không phải là một lệnh.

Vì vậy, các tùy chọn để thực hiện nhị phân hoặc tập lệnh:

Thực hiện nhị phân binary:

$ binary          # when 'binary' is on the PATH, or is a built-in
$ ./binary        # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir

Thực hiện một kịch bản script:

Các tập tin sẽ phải có quyền thực thi trừ khi có quy định khác.

$ script        # execute a script that is on PATH. Will be executed in a new shell.
                # The interpreter to use is determined by the she-bang in the file.
$ ./script      # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir. 
                # Otherwise as above.
$ . script      # execute a script in the current dir. Will be executed in the
                # current shell environment.
$ source script # equivalent to the above *1
$ sh script     # executes 'script' in a new shell *2 (the same goes for 'bash ...',
                # 'zsh ...' etc.). Execute permission not neccessary.

Về cô ấy :

Các tập lệnh có chữ cái (ví dụ #!/bin/sh) trên dòng đầu tiên cho biết trình thông dịch nào sẽ sử dụng.

  • Trình thông dịch này sẽ được sử dụng khi được thực thi bởi ./scripthoặc sử dụng lệnh: script( scriptphải trên PATH)
  • Sử dụng sh scriptsẽ bỏ qua cô ấy và sử dụng, trong trường hợp này, shlà thông dịch viên
  • Sử dụng . scripthoặc sourcesẽ bỏ qua cô ấy và sử dụng trình thông dịch hiện tại (vì .hoặc sourcetương đương với việc chỉ thực hiện từng dòng của tập lệnh trong trình bao hiện tại)

Chú thích

* 1: Điều này chỉ gần như đúng. Trong bash chúng thực sự là cùng một lệnh, nhưng khi sử dụng source, scriptsẽ được tìm kiếm trong $ PATH trước thư mục hiện tại. Đó là bash, nhưng trong các vỏ chỉ POSIX, sourcekhông hoạt động, nhưng .có. Vì vậy, thay vì sử dụng sau này cho tính di động.

* 2: điều thực sự xảy ra là chúng ta chạy sh nhị phân với 'script' làm đối số, điều này sẽ làm cho 'sh' thực thi 'script' trong lớp vỏ mới của nó


2

Đây là một danh sách nhanh các lệnh. Lưu ý, khi tôi đề cập đến PATH, ý tôi là các thư mục chứa các chương trình mà hệ thống biết đến; bạn tìm thấy những người có echo $PATH, và nó sẽ là một cái gì đó như:/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Chữ viết

  • Để thực thi một tập lệnh trong thư mục làm việc hiện tại, sử dụng ./myscript.sh
  • Để thực thi tập lệnh trên một tệp khác, hãy sử dụng (nếu nó nằm trong thư mục làm việc hiện tại), ./myscript.sh textfile.txt
  • Các kịch bản cũng có thể được chạy với các đối số; như được giải thích trong Rute (tr. 68): myfile.sh dogs cats birdssẽ xuất ra The first argument is: dogs, second argument is: cats, third argument is: birdsvì nội dung của tập lệnh này sau shebang là:echo "The first argument is: $1, second argument is: $2, third argument is: $3"

  • Để thực thi một tập lệnh trong thư mục khác, sử dụng ~/Scripts/dogs.sh

  • Để thực thi tập lệnh mà hệ thống biết vì nó nằm trong thư mục bin của bạn trong thư mục chính của bạn (chỉ cần tạo tập lệnh nếu không có, vì nó sẽ tự động được thêm vào PATH của bạn), chỉ cần sử dụng scriptname
  • Để thực thi tập lệnh bạn đã cài đặt, một lần nữa chỉ cần sử dụng tên của nó, bởi vì nó sẽ được hệ thống biết đến: ví dụ: get_iplayer

Binaries

  • Để chạy tệp nhị phân mà hệ thống biết vì nó ở dạng $ PATH, hãy sử dụng tên của chương trình và bất kỳ tham số nào, ví dụ: vlc <stream url to open>
  • Để kiểm tra tệp nhị phân bạn đã biên dịch trước khi cài đặt vào / usr / local / bin hoặc để chương trình độc lập cách xa hệ thống, hãy sử dụng ~/<folder>/app/myprog

Cảm ơn thông tin. Câu lệnh này có đúng không: Để thực thi một tập lệnh hoặc nhị phân không có trong PATH, người ta chỉ cần chỉ định đường dẫn của nó. Lý do ./ là cần thiết cho một tập lệnh trong đường dẫn hiện tại là chỉ 'script.sh' sẽ được hiểu là một lệnh vì nó thiếu ít nhất một dấu gạch chéo /.
Carl

"Để thực thi tập lệnh bạn đã cài đặt", tập lệnh mà tôi "đã cài đặt" là gì? Điểm này có nói giống với điểm trước không?
Carl

@ Carl- nhận xét đầu tiên của bạn là chính xác, nhưng không đúng khi nói rằng hai điểm cuối cùng của tôi về các kịch bản là giống nhau. Trong điểm 5 của phần script tôi đã nói về các script mà người dùng đã thêm thủ công vào thư mục bin của họ trong thư mục chính của họ; ở điểm 6 Tôi đã nói về các tập lệnh như get_iplayer mà chúng đã cài đặt từ kho lưu trữ và như vậy luôn đi vào các thư mục hệ thống, chứ không phải vào thư mục chính của người dùng.

Xin lỗi nhưng tôi vẫn không hiểu rằng, một tập lệnh trong ~ / bin / (nằm trong PATH) hoặc trong một thư mục hệ thống (trong PATH) - làm thế nào có thể có sự khác biệt giữa chúng? Họ có cư xử khác nhau không?
Carl

Tôi chỉ phân biệt giữa các tập lệnh mà người dùng sở hữu và thêm vào ~ / bin và các tập lệnh được sở hữu bởi root trong các thư mục hệ thống.
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.