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 terminalvà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ểuterminallà 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ộtterminalxuấ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ộtterminalxuấ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-inscommands vàexternalcommands.built-inscommands 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àishellthì 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ứprocessnào (?). Danh sáchbuilt-inscommands trênbashvàzshlần lượt như saubashcompgen -bzshprint -roC1 ${(k)builtins}
externalcommands 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,Cvà sau đó mã nguồn được biên dịch thànhbinary. Khi bạn thực thi câu lệnhsudo apt updatethì 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ốupdatevào) vàshell scripts(Là các chương trình được viết bởishell progamming languagenhưbash,zshmà 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 languagechúng ta có filescript.javathì vớishell progamming languagechúng ta có filescript.sh).
 - Cách để kiểm tra command là 
built-inshayexternaltype <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
Ubuntuchúng ta có thể thực thilsnhưnglskhông phải làbuilt-incommand?Đầu tiên bạn có thể thấy
lsbinary thuộc về packagecoreutils.dpkg -S /bin/ls --- coreutils: /bin/lsMà
coreutilspackage (GNU coreutils) được tích hợp sẵn với hệ điều hành khi cài đặtUbuntunê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 packagesxem cócoreutils packagekhô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,shellsẽ xem đó là một câu lệnh - Tiếp theo 
shellsẽ 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-inhayabsolute path(E.g:echohay/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, 
shellsẽ 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.$PATHlà 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/lsthì 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/binlà 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$PATHchí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 
binaryfile 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ứabinaryfile vào biến môi trường$PATH.export $PATH=$PATH:/home/logbasex/bin 
Thank for reading :blush:.