Sửa lỗi 'bash: command not found': Hướng dẫn từng bước cho Linux & macOS

beginner🐧 Linux2026-03-31| Linux (Ubuntu, Debian, CentOS, RHEL), macOS, hoặc bất kỳ môi trường Unix-like nào sử dụng Bash/Zsh.

Error Message

bash: <command>: command not found
#linux#bash#terminal#sysadmin#devops

Tại sao terminal lại từ chối lệnh của bạn?

Bạn đã sẵn sàng làm việc, bạn nhập một lệnh như docker-compose hoặc terraform, và terminal hiện ra một dòng thông báo gây khó chịu: bash: command not found. Đây là một trở ngại phổ biến đối với cả lập trình viên và quản trị viên hệ thống.

Lỗi này đơn giản có nghĩa là shell (Bash) đã tìm kiếm trong danh sách các thư mục "đáng tin cậy" cụ thể nhưng không tìm thấy tệp thực thi nào có tên đó. Không phải lúc nào lỗi này cũng có nghĩa là phần mềm bị thiếu. Thường thì chương trình vẫn nằm trên ổ cứng của bạn, chỉ là Bash không biết tìm nó ở đâu.

Bước 1: Xác nhận phần mềm thực sự đã được cài đặt

Trước khi đi sâu vào các cấu hình phức tạp, hãy kiểm tra xem tệp thực thi (binary) có tồn tại hay không. Đôi khi chúng ta mặc định một công cụ như curl hoặc htop đã được cài đặt sẵn trong khi thực tế thì chưa. Hãy sử dụng công cụ which hoặc command -v để kiểm tra hệ thống.

# Kiểm tra curl
which curl
# Nếu không trả về kết quả, nó không nằm trong PATH của bạn.

Nếu các lệnh này trả về một dòng trống, bạn cần cài đặt gói đó. Ví dụ, trên một phiên bản Ubuntu 22.04 LTS mới, bạn có thể cần chạy:

# Ubuntu/Debian
sudo apt update && sudo apt install curl

# CentOS/RHEL
sudo yum install curl

# macOS (sử dụng Homebrew)
brew install curl

Bước 2: Kiểm tra biến môi trường $PATH

Nếu bạn vừa cài đặt một công cụ như Go (đường dẫn chuẩn: /usr/local/go/bin) hoặc Node.js mà nó vẫn không hoạt động, biến $PATH có khả năng là thủ phạm. Hãy coi $PATH như một bản đồ tìm kiếm. Nếu một thư mục không có trên bản đồ, Bash sẽ không tìm đến đó.

Xem bản đồ tìm kiếm hiện tại của bạn bằng cách chạy:

echo $PATH

Bạn sẽ thấy một chuỗi dài các thư mục được phân tách bằng dấu hai chấm, chẳng hạn như /usr/local/sbin:/usr/local/bin:/usr/bin. Nếu công cụ của bạn nằm trong /opt/special_tool/bin và thư mục đó không có trong danh sách, lệnh sẽ luôn thất bại.

Cách khắc phục nhanh cho phiên làm việc hiện tại

Cần nó hoạt động ngay lập tức? Bạn có thể tạm thời thêm một thư mục vào đường dẫn cho cửa sổ terminal hiện tại:

export PATH=$PATH:/home/linuxuser/.local/bin

Giải pháp lâu dài

Các bản sửa lỗi tạm thời sẽ biến mất ngay khi bạn đóng terminal. Để thay đổi có hiệu lực vĩnh viễn, bạn phải chỉnh sửa tệp cấu hình shell—thường là ~/.bashrc cho Linux hoặc ~/.zshrc cho người dùng macOS.

  • Mở tệp cấu hình: nano ~/.bashrc
  • Đi xuống dưới cùng và thêm: export PATH="$PATH:/your/custom/path"
  • Lưu và thoát (Nhấn Ctrl+O, Enter, sau đó là Ctrl+X).
  • Buộc terminal đọc các thay đổi ngay lập tức: source ~/.bashrc

Bước 3: Sửa quyền thực thi và tiền tố cho Script

Bạn đang cố gắng chạy một script vừa viết, ví dụ như deploy.sh? Nếu bạn nhập deploy.sh và nhận lỗi "command not found", đó là vì Linux từ chối tìm kiếm trong thư mục hiện tại vì lý do bảo mật. Bạn phải chỉ định rõ ràng.

# Lệnh này thất bại
deploy.sh

# Lệnh này hoạt động
./deploy.sh

Nếu bạn nhận được lỗi "Permission denied" (Bị từ chối quyền), tệp đó chưa được đánh dấu là có thể thực thi. Hãy sửa lỗi này bằng lệnh chmod:

chmod +x deploy.sh

Bước 4: Sử dụng Symbolic Link để hệ thống gọn gàng hơn

Việc thêm mười thư mục khác nhau vào $PATH sẽ khiến nó trở nên lộn xộn và chậm chạp. Một cách tiếp cận chuyên nghiệp và gọn gàng hơn là tạo một symbolic link (phím tắt) trong một thư mục đã có sẵn trong đường dẫn, như /usr/local/bin.

# Liên kết một tệp thực thi độc lập tới một vị trí chuẩn
sudo ln -s /opt/my-app-v1.2/bin/app-exe /usr/local/bin/app-exe

Bây giờ, khi bạn gõ app-exe, hệ thống sẽ tìm thấy liên kết trong /usr/local/bin và chuyển hướng nó đến tệp thực tế trong /opt.

Mẹo chuyên gia: Sử dụng 'type -a' để gỡ lỗi

Nếu bạn phân vân không biết phiên bản nào của lệnh đang chạy (hoặc tại sao nó thất bại), hãy sử dụng type -a. Nó sẽ tiết lộ sự thật đằng sau lệnh đó:

type -a python
# Kết quả có thể hiển thị:
# python là /usr/bin/python
# python là /home/user/anaconda3/bin/python

Lệnh này cho bạn biết công cụ của bạn là một bí danh (alias), một hàm shell tích hợp sẵn hay là một tệp vật lý. Đây là cách nhanh nhất để phát hiện xung đột đường dẫn khi bạn cài đặt nhiều phiên bản của một ngôn ngữ như Python hoặc Ruby installed.

Danh sách kiểm tra tóm tắt

  • Kiểm tra lỗi chính tả: Bạn đã nhập kubectl hay kubectel? Ai cũng có lúc nhầm lẫn như vậy.
  • Nhận biết đường dẫn: 90% các lỗi này được giải quyết bằng cách thêm thư mục vào ~/.bashrc.
  • Làm mới: Luôn chạy source ~/.bashrc sau khi chỉnh sửa tệp cấu hình.
  • Tự động hóa: Nếu bạn đang viết các tác vụ Cron, đừng bao giờ dựa vào $PATH. Hãy luôn sử dụng đường dẫn tuyệt đối như /usr/bin/python3 thay vì chỉ dùng python3.

Related Error Notes