Command not found
Published:
Prerequisites
Đã từng gặp lỗi command not found
:)).
Shell
Shell là một chương trình có chức năng chính dùng để đọc các câu lệnh được gửi đến từ console
, tty
hoặc là terminal window (E.g: gnome-terminal)
in GUI
(graphic user interface)
và thực thi. Ngoài ra gồm có nhiều chức năng phụ khác nhau như spell check
, share history between terminal sesion
, command completion
… Dần dà thì ngày hôm nay chúng ta có nhiều loại shell
khác nhau có thể kể tên như sh
(Bourne Shell), bash
(Bourne-again Shell), csh
(C Shell), zsh
(Z Shell)…
Terminal
Terminal gồm có hai kiểu là
virtual terminal
vàphysical terminal
. Tuy nhiên thì mỗi loại có nhiều khái niệm liên quan tương đối dài dòng để nói trong bài viết này nên về cơ bản bạn có hiểu hiểuterminal
là mộttext input/output enviroment
(dùng để nhập cậu lệnh và hiển thị kết quả trả về).- Khi bạn nhấn tổ hợp phím
CTRL
+ALT
+T
, mộtterminal
xuất hiện, nhưng tên gọi chính xác của nó làpseudo terminal/pseudo tty/terminal emulator
. - Khi bạn nhấn tổ hợp phím
CTRL
+ALT
+F3
, mộtterminal
xuất hiện, nhưng tên gọi chính xác của nó làvirtual console/tty
.
Command
Một command là một chỉ dẫn (instruction) được đưa ra bởi người dùng để ra lệnh cho máy tính làm việc gì đó, như là thực thi một số chương trình (program) hoặc tác vụ (task). Các câu lệnh (command) thường được tạo ra bằng cách gõ vào
command line
(chỗ nhập text ngay cạnhcommand prompt
) và sau đó nhấn phímENTER
.- Commands được chia thành hai loại,
built-ins
commands vàexternal
commands.built-ins
commands là những câu lệnh được tích hợp sẵn đi kèm vớishell
, có nghĩa là sau khi càishell
thì chúng ta đã có thể dùng luôn những câu lệnh này mà khi dùng hệ thống không phát sinh thêm bất cứprocess
nào (?). Danh sáchbuilt-ins
commands trênbash
vàzsh
lần lượt như saubash
compgen -b
zsh
print -roC1 ${(k)builtins}
external
commands gồm cóexecutable binaríes
(Là các chương trình được viết từ các ngôn ngữ lập trình khác nhau nhưJava
,C
và sau đó mã nguồn được biên dịch thànhbinary
. Khi bạn thực thi câu lệnhsudo apt update
thì bản chất bạn đã thực thi binary file nằm ở thư mục/usr/bin/apt (which apt)
và truyền tham sốupdate
vào) vàshell scripts
(Là các chương trình được viết bởishell progamming language
nhưbash
,zsh
mà cho phép chúng ta dùng một câu lệnh để thực thi một chuỗi liên tiếp các câu lệnh khác nhau được gom lại trong mộtscript
. Nếu vớiJava programming language
chúng ta có filescript.java
thì vớishell progamming language
chúng ta có filescript.sh
).
- Cách để kiểm tra command là
built-ins
hayexternal
type <COMMAND NAME>
- Syntax
command [options] [arguments]
options và arguments có thể có hoặc không. Tuy nhiên thì một số câu lệnh require arguments.
- Hỏi đáp
Tại sao sau khi install
Ubuntu
chúng ta có thể thực thils
nhưngls
không phải làbuilt-in
command?Đầu tiên bạn có thể thấy
ls
binary thuộc về packagecoreutils
.dpkg -S /bin/ls --- coreutils: /bin/ls
Mà
coreutils
package (GNU coreutils) được tích hợp sẵn với hệ điều hành khi cài đặtUbuntu
nên dĩ nhiên là dùng được rồi. Bạn có thể xác thực điều này bằng cách xem trong danh sáchmanual installed packages
xem cócoreutils package
không:apt-mark showmanual | grep coreutils
- Why is echo a shell built in command?
- Why cd is not a program
- What is the difference between a builtin command and one that is not?
- Một số khái niệm khác như
command prompt
,command line
,CLI (Commad Line Interpreter)
, các bạn chủ động tìm hiểu thêm nhé.
Command not found
Á á á…
Command not found
là một lỗi khá thường gặp mà nếu chưa hiểu rõ chúng ta sẽ không biết xử lý như thế nào cả. Và bây giờ chúng ta hãy xem tại sao lỗi này lại xảy ra nhé.
- Đầu tiên, khi bạn gõ bất kì cái gì lên terminal và nhấn phím
ENTER
,shell
sẽ xem đó là một câu lệnh - Tiếp theo
shell
sẽ kiểm tra xem chuỗi kí tự trước dấu cách đầu tiên trong đoạn text nhập vào làbuilt-in
hayabsolute path
(E.g:echo
hay/bin/echo
,/usr/bin/apt
) đến tập tin thực thi (i.e:executable binary
) - Nếu không phải cả hai trường hợp trên,
shell
sẽ tiến hành tìm kiếm bên trong tất cả những thư mục được liệt kê trong biến môi trường(enviroment variable
)PATH
(được phân tách bằng dấu:
) xem có tập tin có tên như trên không.$PATH
là gìĐể trả lời cho câu hỏi này, hãy tưởng tượng mỗi lần ta gõ 1 lệnh nào đó, ví dụ ls chẳng hạn (viết tắt của l i s t, dùng để in danh sách folder), thì hệ điều hành sẽ tìm file thực thi (binary) của chương trình mang tên ls ở đâu? Nếu gõ thẳng ra là
/bin/ls
thì chẳng nói, vì lúc đó ta đã bảo trực tiếp cho hệ điều hành sộc vào folder/bin
là sẽ thấyls
. Còn không nói cụ thể, thì chẳng nhẽ sẽ tìm ở toàn bộ các folder trên máy? Lúc này đây ta cần lưu lại đường dẫn đến các chương trình ở 1 nơi nào đó để hệ điều hành biết mà giới hạn chỗ đi tìm. Biến$PATH
chính là nơi để lưu lại đường dẫn trên, mà không chỉ một, mà có thể có nhiều đường dẫn, bởi người dùng có thể chứa chương trình ở nhiều folder khác nhau.Lưu ý:
$PATH
, không phải$path
, hay$Path
.
Nếu tập thi thực thi được tìm thấy, nó sẽ được thực thi, giả sử rằng không có vấn đề nào khác. Nếu không
command not found
được trả về.- Đến đây có hai cách xử lý, một là thêm
binary
file vào một trong số những thư mục có sẵn trong biến môi trường$PATH
, hai là thêm đường dẫn tuyệt đối của thư mục chứabinary
file vào biến môi trường$PATH
.export $PATH=$PATH:/home/logbasex/bin
Thank for reading :blush:.