Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Làm chủ Terminal Linux: Hướng dẫn chuyên gia về Piping & Redirection

Làm chủ Terminal Linux: Hướng dẫn chuyên gia về Piping & Redirection

Giao diện dòng lệnh (CLI) trong Linux cung cấp cách mạnh mẽ thực hiện nhiều tác vụ trên hệ thống. Nhờ nguồn gốc, Linux có nhiều tính năng tích hợp sẵn trong terminal.

Hai tính năng mạnh mẽ đó là piping (ống dẫn) và redirection (chuyển hướng). Chúng cho phép chuyển hướng output và input của lệnh đến lệnh khác hoặc tệp.

Trong bài này, bạn sẽ học piping và redirection trong Linux là gì, sau đó đi sâu vào cách sử dụng chúng.

Điều kiện tiên quyết

Để hiểu trọn vẹn hướng dẫn này, bạn cần ít nhất:

  • Hiểu cơ bản về hệ điều hành Linux.
  • Kinh nghiệm cơ bản làm việc với dòng lệnh Linux.
  • Có quyền truy cập dòng lệnh Linux để thử lệnh.

Xem hướng dẫn dòng lệnh Linux nếu bạn mới hoặc cần ôn lại.

Piping trong Linux là gì?

Trước khi đi vào cách làm, piping có nghĩa gì? Piping là việc chuyển output của một lệnh Linux làm input cho lệnh khác. Bạn có thể chuyển standard output hoặc standard error từ lệnh này sang lệnh khác bằng piping.

Ví dụ đơn giản: lấy output của lệnh này làm input cho lệnh khác. Ký tự metacharacter pipe (|) dùng để thực hiện.

Nếu mới biết khái niệm metacharacter, đó chỉ là tên gọi cho ký tự có ý nghĩa đặc biệt trong dòng lệnh. Có metacharacter khác như less than (<), greater than (>), ampersand (&), v.v.

Cơ bản về Piping

Cú pháp cơ bản dùng lệnh pipe:

command1 | command2 | command3 | ... | commandN 

Trong cú pháp trên, terminal thực thi lệnh từ trái sang phải. Bắt đầu command1, output làm input cho command2. Output của command2 làm input cho command3, v.v. Điểm hay của piping là có thể nối bao nhiêu lệnh tùy thích.

Ví dụ Piping

Dưới đây là vài ví dụ dùng lệnh pipe thực hiện các tác vụ.

1. Đếm số lượng tệp và thư mục

ls -l | wc -l 

Trong ví dụ, phần đầu liệt kê tất cả tệp và thư mục trong thư mục hiện tại bằng lệnh ls. Tùy chọn -l yêu cầu ls liệt kê dạng danh sách dài (long list format).

Output của ls -l được pipe sang phần hai. Lệnh wc -l đếm số dòng từ output của ls -l ở phần một và in kết quả ra terminal.

2. Sắp xếp danh sách tệp và thư mục

ls | sort 

Trong lệnh trên, ls xuất danh sách tệp/thư mục hiện tại. Danh sách được pipe sang sort, sắp xếp theo chữ cái và in ra terminal.

3. Sắp xếp và hiển thị từ duy nhất từ tệp

cat words.txt | sort -r | uniq 

Ví dụ 3 gồm 3 lệnh riêng biệt nối bằng 2 pipe. Lệnh đầu xuất nội dung file words.txt chứa danh sách từ.

Output pipe sang sort -r, sắp xếp từ theo thứ tự chữ cái ngược. Cuối cùng, từ đã sắp xếp pipe sang uniq, loại trùng lặp và xuất từ duy nhất đã sắp xếp.

Tại sao và khi nào nên dùng Command Piping Linux?

Piping không chỉ biết cú pháp. Cú pháp khá đơn giản. Để dùng hiệu quả piping, bạn nên hiểu bản chất nó.

Mục đích piping: giúp nối lệnh, dùng output của lệnh này làm input của lệnh khác.

Piping không dùng để nối các lệnh không liên quan mà bạn muốn chạy lần lượt. Nếu cần vậy, viết lệnh trên terminal phân tách bằng dấu chấm phẩy (;) với cú pháp:

command1 ; command2 ; ... ; commandN 

Redirection trong Linux là gì?

Redirection là việc chỉ định nơi input hoặc output của lệnh đi. Mặc định, lệnh nhận dữ liệu từ standard input và xuất kết quả ra standard output.

Một lĩnh vực chính redirection hữu ích là làm việc với lệnh và tệp. Ví dụ, chuyển output của lệnh vào tệp thay vì in ra terminal. Hoặc khai báo tệp nào đó làm input cho lệnh.

Giống piping, Linux cung cấp ký tự đặc biệt cho redirection. Đây là các ký tự quan trọng và chức năng:

  • > – chuyển output của lệnh vào tệp cho trước.
  • < – chuyển nội dung tệp cho trước vào lệnh.
  • >> – chuyển output của lệnh vào tệp. Nối thêm nếu tệp tồn tại và có nội dung.
  • 2> – chuyển thông báo lỗi từ lệnh vào tệp.
  • 2>> – chuyển thông báo lỗi vào tệp. Nối thêm nếu tệp tồn tại và có nội dung.
  • &> – chuyển cả standard output và error vào tệp.
  • &>> – chuyển cả standard output và error vào tệp. Nối thêm nếu tệp tồn tại và có nội dung.

Hãy xem chi tiết từng ký tự redirection.

1. Output Redirection với >

Ký hiệu > cho phép chuyển output của lệnh vào tệp xác định. Dùng ký hiệu này, bạn chuyển output vào bất kỳ tệp hiện có. Nếu không tồn tại, ký tự redirection sẽ tự tạo mới.

Tuy nhiên, cẩn thận khi ghi vào tệp hiện có vì nội dung sẽ bị ghi đè không cảnh báo.

Cú pháp output redirection:

command > file 

Output của command sẽ ghi vào file thay vì standard output (tức in ra terminal). Ví dụ:

ls -a > contents.txt 

Trong lệnh trên, danh sách mục trong thư mục hiện tại (kể cả dotfiles, thư mục, tệp) sẽ ghi vào contents.txt. Bạn không thấy output trên terminal do redirection.

2. Output Redirection với >>

>> cho phép chuyển output của lệnh vào tệp. Khác với ký tự greater than đơn (>), >> sẽ nối thêm output nếu ghi vào tệp hiện có (thay vì ghi đè). Nếu tệp không tồn tại, tạo mới.

Cú pháp:

command >> file 

Ví dụ dùng >> thực hiện hành động giống trước:

ls -a >> contents.txt 

3. Input Redirection với <

Ký tự < trong dòng lệnh cho phép chuyển input cho lệnh từ tệp thay vì bàn phím. Cú pháp input redirection:

command < file 

Ví dụ input redirection:

wc -w < files.txt 

Trong ví dụ, truyền files.txt làm input cho wc -w đếm số từ trong tệp. Nhưng bạn không cần dùng ký tự input redirection trong nhiều trường hợp vì đó là hành vi mặc định. Lệnh trên tương tự:

wc -w files.txt 

4. Error Redirection với 2> và 2>>

Khi làm việc dòng lệnh, bạn có thể gặp lỗi. Ví dụ, muốn chạy tệp mà không có quyền phù hợp. Thay vì để terminal in lỗi, dùng ký tự error redirection chỉ định nơi thông báo lỗi đi.

Nơi tốt để redirect lỗi là tệp chuyên lưu lỗi. Ví dụ đơn giản: lệnh thử truy cập danh sách tệp trong thư mục không tồn tại:

ls nonexistent 2> error.txt 

Trong ví dụ, terminal ném lỗi vì không có tệp nonexistent. Thay vì in ra console, lỗi lưu trong error.txt nhờ ký tự error redirection. Tuy nhiên, tệp sẽ rỗng nếu không có lỗi.

Nếu phải nối lỗi vào tệp hiện có thay vì ghi đè, dùng 2>> thay vì 2>.

5. Output và Error Redirection với &> và &>>

Thay vì chọn chuyển standard output hay standard error, &> cho phép chuyển cả hai cùng lúc. Có thể xem &> như viết tắt kết hợp output redirection (>) và error redirection (2>).

Cú pháp dùng &>:

command &> output.txt 

Lỗi hoặc output của command ghi vào output.txt. Ví dụ:

ls sample &> output.txt 

Trong lệnh trên, nếu thư mục sample không tồn tại hoặc tồn tại nhưng bạn không có quyền đọc, lỗi phù hợp ghi vào output.txt. Nhưng nếu tồn tại và có quyền đọc, nội dung sẽ xuất trong output.txt.

Dùng &>> cho phép nối output vào tệp nếu tồn tại và có nội dung.

Kết hợp Piping và Redirection để khai phá sức mạnh Command Line

Kết hợp piping và redirection cho phép thực hiện các thao tác phức tạp mà không tốn nhiều công sức. Học cách kết hợp hai tính năng này, bạn tạo được lệnh phức tạp thực hiện nhiều hành động với ít gõ phím hơn.

Xét lệnh sau:

ls | grep ".txt" > text_files.txt 

Lệnh ls liệt kê nội dung thư mục hiện tại. Output pipe sang grep lọc tệp text. Cuối cùng, output của grep redirect vào tệp text_files.txt.

Ví dụ đơn giản nhưng mạnh mẽ này cho thấy: khi nói đến piping và redirection, giới hạn chỉ là trí tưởng tượng của bạn.

Kết luận

Trong hướng dẫn này, bạn học cơ bản về piping và redirection trong Linux. Đã bao gồm cơ bản cùng ví dụ cách dùng hai tính năng.

Hai tính năng riêng lẻ đã mạnh, nhưng bạn có thể đi xa hơn bằng cách kết hợp chúng trong lệnh, như phần cuối所示.

Học lập trình miễn phí. Chương trình mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người tìm việc lập trình viên. Bắt đầu ngay