Command not found

6 minute read

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 terminalphysical 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 terminal là 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ột terminal 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ột terminal 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ạnh command prompt) và sau đó nhấn phím ENTER.

  • 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ới shell, có nghĩa là sau khi cài shell 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ách built-ins commands trên bashzsh lần lượt như sau
      • bash
          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ành binary. Khi bạn thực thi câu lệnh sudo 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ởi shell 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ột script. Nếu với Java programming language chúng ta có file script.java thì với shell progamming language chúng ta có file script.sh).
  • Cách để kiểm tra command là built-ins hay external
      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
  • 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 hay absolute 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ấ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 $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ứa binary file vào biến môi trường $PATH.
      export $PATH=$PATH:/home/logbasex/bin
    

Thank for reading :blush:.