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ểu- terminallà một- text 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ạnh- command prompt) và sau đó nhấn phím- ENTER.
- 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ới- shell, có nghĩa là sau khi cài- shellthì 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ách- built-inscommands trên- bashvà- zshlần lượt như sau- bash- compgen -b
- zsh- print -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ành- binary. Khi bạn thực thi câu lệnh- sudo 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ởi- shell 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ột- script. Nếu với- Java programming languagechúng ta có file- script.javathì với- shell progamming languagechúng ta có file- script.sh).
 
- Cách để kiểm tra command là built-inshayexternaltype <COMMAND NAME>
- Syntaxcommand [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 thi- lsnhưng- lskhông phải là- built-incommand?- Đầu tiên bạn có thể thấy - lsbinary thuộc về package- coreutils.- dpkg -S /bin/ls --- coreutils: /bin/ls
- Mà - coreutilspackage (GNU coreutils) được tích hợp sẵn với hệ điều hành khi cài đặt- Ubuntunê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ách- manual 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ấy- ls. 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:.
