Làm thế nào để gọi lệnh trong shell hoạt động
Không, nó không phải là một lệnh. Cách shell hoạt động là khi bạn nhập một dòng văn bản, từ đầu tiên sẽ được coi là lệnh và nếu lệnh không phải là một trong những shell được tích hợp thì shell sẽ xem xét tất cả các vị trí được liệt kê trong PATH
biến môi trường .
Điều gì xảy ra nếu khi lệnh bạn muốn chạy nằm trong cùng thư mục với vị trí hiện tại của bạn nhưng thư mục đó không có trong danh sách PATH
thư mục? Đó là khi bạn cần sử dụng ./
. Đó là một cách chính xác giống như làm /bin/bash
- bạn đang nói với shell nơi lệnh bạn muốn nằm, một đường dẫn đầy đủ đến nó. Và trong trường hợp ./ bạn đang nói với shell "hãy tìm trong thư mục này". Vì vậy, phần quan trọng là bạn phải ở trong cùng thư mục chứa tệp.
Tất nhiên, để thực sự chạy một tệp thực thi, nó phải có tập bit thực thi, vì vậy bạn sẽ cần chmod +x ./my_file
.
Vì vậy, các bước quan trọng:
cd
nơi bạn đã lưu tệp; nếu nó ở trong ~/Downloads
thìcd ~/Downloads
- Chạy
chmod +x ./truecrypt-7.2-setup-x86
, cái này nói "tạo tập tin truecrypt-7.2-setup-x86 đang ở thư mục này có thể thực thi được"
- Và bây giờ làm
sudo ./truecrypt-7.2-setup-x86
Lưu ý rằng việc sử dụng ./
không phải là hành vi ngẫu nhiên, nhưng thực sự là một tiêu chuẩn, được chỉ định bởi tiêu chuẩn Giao diện hệ điều hành di động (còn gọi là POSIX) , xem cụ thể phần "Tìm kiếm và thực thi lệnh".
Tái tạo lỗi
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
LƯU Ý : thông báo lỗi được cung cấp bởi sudo
rõ ràng là sai lệch vì vậy đây là điều cần lưu ý; tuy nhiên xin lưu ý rằng đây không phải là cốt lõi của câu hỏi mà OP đang hỏi.
Tài liệu và tài liệu tham khảo
Từ bash
4.3 hướng dẫn sử dụng, phần "THỰC HIỆN HÀNH LÝ":
Nếu tên không phải là hàm shell cũng không phải là hàm dựng và không chứa dấu gạch chéo, bash tìm kiếm từng phần tử của PATH cho một thư mục chứa tệp thực thi theo tên đó.
Từ Tại sao bạn cần ./ (dấu chấm chéo) trước tên tập lệnh để chạy nó trong bash? :
Nó hoạt động với ./ vì POSIX chỉ định rằng một tên lệnh có chứa / sẽ được sử dụng trực tiếp làm tên tệp, loại bỏ tìm kiếm trong $ PATH. Bạn có thể đã sử dụng đường dẫn đầy đủ cho cùng một hiệu ứng, nhưng ./ ngắn hơn và dễ viết hơn.
./
phần của lệnh đang nói "Hãy tìm trong thư mục hiện tại và thực thi lệnh 'truecrypt-7.2-setup-x86' từ đây". Bạn cần chạy lệnh này từ thư mục nơi bạn giải nén tệp.