Sử dụng toán tử chuyển hướng lệnh. Linux: chuyển hướng

Bằng cách sử dụng ánh xạ lại I/O, một chương trình có thể hướng đầu ra của nó sang đầu vào của chương trình khác hoặc chặn đầu ra của chương trình khác và sử dụng nó làm đầu vào. Vì vậy, có thể chuyển thông tin từ quy trình này sang quy trình khác với chi phí phần mềm tối thiểu. Trong thực tế, điều này có nghĩa là đối với các chương trình sử dụng thiết bị đầu vào và đầu ra tiêu chuẩn, hệ điều hành cho phép:

  • xuất thông báo chương trình không ra màn hình (luồng đầu ra tiêu chuẩn), mà ra tệp hoặc máy in (chuyển hướng đầu ra);
  • đọc dữ liệu đầu vào không phải từ bàn phím (luồng đầu vào tiêu chuẩn), mà từ tệp đã chuẩn bị trước đó (chuyển hướng đầu vào);
  • chuyển đầu ra thông báo của một chương trình làm đầu vào cho chương trình khác (kết hợp đường ống hoặc hướng dẫn).

Từ dòng lệnh, các tính năng này được triển khai như sau. Để chuyển hướng đầu ra tin nhắn văn bản bằng bất kỳ lệnh nào từ dòng lệnh sang tệp văn bản, bạn cần sử dụng cấu trúc lệnh > tên tệp. Nếu tệp được chỉ định cho đầu ra đã tồn tại thì nó sẽ bị ghi đè (nội dung cũ sẽ bị mất); nếu nó không tồn tại thì nó sẽ được tạo. Bạn cũng không thể tạo lại tệp mà gắn thêm thông tin đầu ra bằng lệnh vào cuối tệp hiện có. Để thực hiện việc này, lệnh chuyển hướng đầu ra phải được chỉ định như sau: lệnh >> tên tệp. Sử dụng một biểu tượng< можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла

Ví dụ về chuyển hướng I/O trên dòng lệnh

Dưới đây là một số ví dụ về chuyển hướng I/O.

1. Kết quả đầu ra lệnh ping nộp ping ya.ru > ping.txt

2. Thêm văn bản trợ giúp cho Các lệnh XCOPY tới file copy.txt: XCOPY /? >> sao chép.txt

Nếu cần, các thông báo lỗi (dòng lỗi tiêu chuẩn) có thể được chuyển hướng đến một tệp văn bản bằng cách sử dụng cấu trúc lệnh 2> tên tệp. Trong trường hợp này, đầu ra tiêu chuẩn sẽ được in ra màn hình. Cũng có thể xuất thông báo thông tin và thông báo lỗi vào cùng một tệp. Điều này được thực hiện như sau: lệnh > tên tệp 2 >&1

Ví dụ: lệnh sau chuyển hướng đầu ra tiêu chuẩn và lỗi tiêu chuẩn sang copy.txt: XCOPY A:\1.txt C: > copy.txt 2>&1

Mặc dù các chương trình thường xử lý các luồng I/O tiêu chuẩn, nhưng như đã nêu, shell có các phương tiện đặc biệt để chuyển hướng I/O.

5.5.1 Toán tử >,< и >>

Các ký hiệu " được sử dụng để biểu thị sự chuyển hướng > ", "< " Và " >> ". Cách sử dụng phổ biến nhất là chuyển hướng đầu ra lệnh sang một tệp. Dưới đây là một ví dụ:

$ ls -l > /home/jim/dir.txt

Lệnh này sẽ lưu trong tệp /home/jim/dir.txt danh sách các tệp và thư mục con của thư mục hiện tại tại thời điểm lệnh được thực thi ls; Hơn nữa, nếu tệp được chỉ định không tồn tại, nó sẽ được tạo; nếu nó tồn tại, nó sẽ bị ghi đè; nếu bạn muốn đầu ra lệnh được thêm vào cuối tệp hiện có, thì thay vì ký hiệu bạn cần > sử dụng >> . Trong trường hợp này, sự hiện diện của khoảng trắng trước hoặc sau ký tự > hoặc >> là phi vật chất và chỉ phục vụ cho sự thuận tiện của người dùng.

Bạn có thể gửi đầu ra không chỉ tới một tệp mà còn tới đầu vào của lệnh khác hoặc tới một thiết bị (chẳng hạn như máy in). Vì vậy, để đếm số từ trong tệp /home/jim/report.txt, bạn có thể sử dụng lệnh sau:

$ cat /home/jim/report.txt > wc -w

và để in tập tin, sử dụng lệnh:

$ cat /home/jim/report.txt > lpr

Như bạn có thể thấy, người vận hành > dùng để chuyển hướng luồng đầu ra. Liên quan đến luồng đầu vào, một chức năng tương tự được thực hiện bởi toán tử < . Lệnh ví dụ ở trên để đếm số từ trong một tệp cụ thể có thể được viết lại như sau (lưu ý không có lệnh con mèo):

$wc -w< /home/jim/report.txt

Tùy chọn chuyển hướng này thường được sử dụng trong nhiều tập lệnh khác nhau cho các lệnh thường chấp nhận (hoặc mong đợi) đầu vào bàn phím. Trong một tập lệnh tự động hóa một số thao tác thông thường, bạn có thể cung cấp cho lệnh thông tin cần thiết từ một tệp trong đó những gì cần nhập để thực thi lệnh này đã được ghi trước.

Bởi vì thực tế là các biểu tượng < , > >> hoạt động trên các luồng tiêu chuẩn, chúng có thể được sử dụng không chỉ theo cách thông thường, như thường được thực hiện, mà còn theo một cách hơi khác. Vì vậy, các lệnh sau là tương đương:

$ mèo > tập tin

tập tin $cat>

$ >file mèo

$ > tập tin mèo

Tuy nhiên, tự nó (không có bất kỳ lệnh nào xác định luồng tiêu chuẩn) thì không thể sử dụng biểu tượng chuyển hướng, do đó, chẳng hạn, người ta không thể gõ

$tệp1 > tệp2

lấy một bản sao của một tập tin. Nhưng điều này không làm giảm tầm quan trọng của cơ chế này, bởi vì các luồng tiêu chuẩn được xác định cho bất kỳ lệnh nào. Trong trường hợp này, bạn có thể chuyển hướng không chỉ đầu vào và đầu ra tiêu chuẩn mà còn cả các luồng khác. Để thực hiện việc này, hãy chỉ định số luồng được chuyển hướng trước biểu tượng chuyển hướng. stdin đầu vào tiêu chuẩn là số 0, stdout đầu ra tiêu chuẩn là số 1, stderr thông báo lỗi tiêu chuẩn là số 2. Nghĩa là, định dạng đầy đủ của lệnh chuyển hướng là (hãy nhớ rằng khoảng trắng gần > là tùy chọn):

lệnh N>M

Ở đâu NM- số lượng luồng tiêu chuẩn (0,1,2) hoặc tên tệp. Sử dụng ký hiệu trong một số trường hợp < , > >> mà không chỉ định số kênh hoặc tên tệp chỉ có thể thực hiện được vì theo mặc định, 1 được thay thế cho số bị thiếu, tức là đầu ra tiêu chuẩn. Có, nhà điều hành > mà không chỉ định một số được hiểu là 1 > .

Ngoài việc chuyển hướng đơn giản các luồng tiêu chuẩn, bạn không chỉ có thể chuyển hướng một luồng sang kênh này hay kênh khác mà còn có thể tạo một bản sao nội dung của luồng tiêu chuẩn. Có một biểu tượng đặc biệt cho việc này & , được đặt trước số kênh mà luồng được chuyển hướng đến:

lệnh N > &M

Lệnh này có nghĩa là đầu ra của số kênh Nđược gửi đến cả đầu ra tiêu chuẩn và được sao chép vào số kênh M. Ví dụ: để sao chép các thông báo lỗi trên đầu ra tiêu chuẩn, bạn cần đưa ra lệnh 2>&1, trong khi 1>&2 sao chép stdout thành stderr. Tính năng này đặc biệt hữu ích khi chuyển hướng đầu ra sang một tệp, vì khi đó cả hai chúng ta đều nhìn thấy các thông báo trên màn hình và lưu chúng vào tệp.

5.5.2 Người vận hành |

Một tùy chọn đặc biệt để chuyển hướng đầu ra là kênh phần mềm (đôi khi được gọi là đường ống hoặc băng tải). Để thực hiện việc này, hai hoặc nhiều lệnh, sao cho đầu ra của lệnh trước đóng vai trò là đầu vào cho lệnh tiếp theo, được kết nối (hoặc tách biệt, nếu bạn muốn) bằng ký tự thanh dọc - "|". Trong trường hợp này, luồng đầu ra tiêu chuẩn của lệnh nằm ở bên trái ký hiệu | , được gửi đến đầu vào tiêu chuẩn của chương trình nằm ở bên phải ký hiệu | . Ví dụ:

$ mèo myfile | grep Linux | wc -l

Dòng này có nghĩa là đầu ra của lệnh là con mèo, tức là văn bản từ tệp myfile, sẽ được gửi đến đầu vào lệnh grep, nó sẽ chỉ làm nổi bật những dòng có chứa từ "Linux". Đầu ra lệnh grep lần lượt sẽ được chuyển đến đầu vào lệnh wc -l, sẽ đếm số dòng như vậy.

Các ống chương trình được sử dụng để kết hợp một số chương trình nhỏ, mỗi chương trình chỉ thực hiện các phép biến đổi cụ thể trên luồng đầu vào của nó, để tạo ra một lệnh tổng quát dẫn đến một số phép biến đổi phức tạp hơn.

Cần lưu ý rằng shell đồng thời gọi để thực thi tất cả các lệnh có trong đường ống, khởi chạy một phiên bản shell riêng cho từng lệnh, để ngay khi chương trình đầu tiên bắt đầu tạo ra thứ gì đó trong luồng đầu ra của nó, lệnh tiếp theo bắt đầu xử lý nó. Theo cách tương tự, mỗi lệnh tiếp theo thực hiện thao tác riêng của nó, chờ dữ liệu từ lệnh trước và tạo ra kết quả làm đầu vào cho lệnh tiếp theo. Nếu bạn muốn một lệnh hoàn thành hoàn toàn trước khi lệnh tiếp theo bắt đầu, bạn có thể sử dụng lệnh đó trên một dòng làm ký hiệu đường dẫn | , và dấu chấm phẩy ; . Trước mỗi dấu chấm phẩy, shell sẽ dừng và đợi tất cả các lệnh trước đó có trong đường ống hoàn tất thực thi.

Trạng thái thoát (giá trị boolean được trả về sau khi hoàn thành chương trình) từ đường ống giống với trạng thái thoát được trả về bởi lệnh cuối cùng trong đường ống. Bạn có thể đặt ký hiệu "!" trước lệnh đầu tiên của đường ống, khi đó trạng thái thoát khỏi đường ống sẽ là phủ định logic của trạng thái thoát khỏi lệnh cuối cùng. Shell đợi tất cả các lệnh đường ống hoàn thành trước khi đặt giá trị trả về.

5.5.3 Bộ lọc

Ví dụ cuối cùng ở trên (với lệnh grep) có thể được sử dụng để minh họa một khái niệm quan trọng khác, đó là chương trình lọc. Bộ lọc là các lệnh (hoặc chương trình) lấy luồng dữ liệu đầu vào, thực hiện một số biến đổi trên đó và xuất kết quả thành đầu ra tiêu chuẩn (từ đó nó có thể được chuyển hướng đến nơi khác theo ý của người dùng). Các lệnh lọc bao gồm các lệnh đã được đề cập ở trên mèo, nhiều hơn, ít hơn, wc, cmp, khác, cũng như các lệnh sau.

Bảng 5.1. Lệnh lọc

Đội

Mô tả ngắn

grep, fgrep, ví dụ

Tìm kiếm tệp đầu vào hoặc đầu vào tiêu chuẩn cho các dòng chứa mẫu đã chỉ định và ghi chúng vào đầu ra tiêu chuẩn

Thay thế tất cả các ký tự xuất hiện trong luồng đầu vào được liệt kê trong danh sách đã cho bằng các ký tự tương ứng từ danh sách được chỉ định thứ hai

liên lạc

So sánh hai tệp theo từng dòng và xuất ra 3 cột với đầu ra tiêu chuẩn: một - dòng chỉ xuất hiện trong 1 tệp, dòng thứ hai chỉ xuất hiện trong tệp thứ 2: và dòng thứ ba xuất hiện trong cả hai tệp

Định dạng tệp văn bản hoặc nội dung đầu vào tiêu chuẩn để in

sed

Trình soạn thảo chuỗi được sử dụng để thực hiện một số phép biến đổi trên luồng dữ liệu đầu vào (lấy từ tệp hoặc từ đầu vào tiêu chuẩn)

Một bộ lọc đặc biệt là lệnh phát bóng, nó “phân chia” luồng đầu vào, hướng nó một bên đến đầu ra tiêu chuẩn và mặt khác tới một tệp (bạn phải chỉ định tên của tệp này). Dễ dàng nhận thấy qua hành động của nó lệnh phát bóng tương tự như toán tử chuyển hướng 1>&tập tin.

Khả năng của các bộ lọc có thể được mở rộng đáng kể thông qua việc sử dụng các biểu thức chính quy, cho phép bạn sắp xếp, chẳng hạn như tìm kiếm bằng nhiều mẫu khác nhau, thường rất phức tạp.

Có thể nói rất nhiều điều về chuyển hướng và bộ lọc. Nhưng tài liệu này có trong hầu hết các sách về UNIX và Linux, ví dụ Petersen [P1.4] và Kelly-Bootle [P1.8]. Do đó, chúng tôi sẽ giới hạn bản thân trong những gì đã nói và chuyển sang xem xét cái gọi là môi trường hoặc môi trường do lớp vỏ tạo ra.

V. Kostromin (kos và rus-linux dot net) - 5.5. Chuyển hướng I/O, kênh và bộ lọc

Khả năng chuyển hướng tích hợp của Linux cung cấp cho bạn nhiều công cụ đơn giản hóa cho mọi loại tác vụ. Khả năng quản lý các luồng I/O khác nhau sẽ tăng năng suất đáng kể, cả khi phát triển phần mềm phức tạp và khi quản lý tệp bằng dòng lệnh.

Chủ đề I/O

Đầu vào và đầu ra trong môi trường Linux được phân phối giữa ba luồng:

  • Đầu vào tiêu chuẩn (đầu vào tiêu chuẩn, stdin, số luồng 0)
  • Đầu ra tiêu chuẩn (thiết bị xuất chuẩn, số 1)
  • Lỗi tiêu chuẩn hoặc luồng chẩn đoán (lỗi tiêu chuẩn, stderr, số 2)

Khi người dùng tương tác với thiết bị đầu cuối, đầu vào tiêu chuẩn sẽ được truyền qua bàn phím của người dùng. Đầu ra tiêu chuẩn và lỗi tiêu chuẩn được hiển thị dưới dạng văn bản trên thiết bị đầu cuối của người dùng. Tất cả ba luồng này được gọi là luồng tiêu chuẩn.

Đầu vào tiêu chuẩn

Luồng đầu vào tiêu chuẩn thường truyền dữ liệu từ người dùng đến chương trình. Các chương trình yêu cầu đầu vào tiêu chuẩn thường nhận đầu vào từ một thiết bị (chẳng hạn như bàn phím). Đầu vào tiêu chuẩn dừng khi đạt đến EOF (cuối tập tin). EOF chỉ ra rằng không còn dữ liệu để đọc.

Để xem cách nhập tiêu chuẩn hoạt động như thế nào, hãy chạy chương trình cat. Tên của công cụ này có nghĩa là “nối” (để kết nối hoặc kết hợp một cái gì đó). Thông thường công cụ này được sử dụng để kết hợp nội dung của hai tệp. Khi chạy không có đối số, cat sẽ mở dấu nhắc lệnh và chấp nhận nội dung của đầu vào tiêu chuẩn.

Bây giờ hãy nhập một số số:

1
2
3
ctrl-d

Bằng cách nhập một số và nhấn enter, bạn gửi đầu vào tiêu chuẩn tới chương trình mèo đang chạy để chấp nhận dữ liệu. Ngược lại, chương trình cat hiển thị đầu vào nhận được trên đầu ra tiêu chuẩn.

Người dùng có thể đặt EOF bằng cách nhấn ctrl-d, thao tác này sẽ khiến chương trình cat dừng lại.

Đầu ra tiêu chuẩn

Đầu ra tiêu chuẩn ghi lại dữ liệu do chương trình tạo ra. Nếu đầu ra tiêu chuẩn chưa được chuyển hướng, nó sẽ xuất văn bản tới thiết bị đầu cuối. Hãy thử chạy lệnh sau làm ví dụ:

echo Gửi đến thiết bị đầu cuối thông qua đầu ra tiêu chuẩn

Lệnh echo, không có bất kỳ tùy chọn bổ sung nào, hiển thị trên màn hình tất cả các đối số được truyền cho nó trên dòng lệnh.

Bây giờ hãy chạy echo mà không có bất kỳ đối số nào:

Lệnh sẽ trả về một chuỗi trống.

Lỗi tiêu chuẩn

Luồng tiêu chuẩn này ghi lại các lỗi do một chương trình bị lỗi tạo ra. Giống như đầu ra tiêu chuẩn, luồng này gửi dữ liệu đến thiết bị đầu cuối.

Hãy xem một ví dụ về luồng lỗi lệnh ls. Lệnh ls hiển thị nội dung của các thư mục.

Không có đối số, lệnh này trả về nội dung của thư mục hiện tại. Nếu bạn cung cấp tên thư mục làm đối số cho ls, lệnh sẽ trả về nội dung của nó.

Vì thư mục % không tồn tại nên lệnh sẽ trả về lỗi tiêu chuẩn:

ls: không thể truy cập %: Không có tập tin hoặc thư mục như vậy

Chuyển hướng luồng

Linux cung cấp các lệnh đặc biệt để chuyển hướng từng luồng. Các lệnh này ghi đầu ra tiêu chuẩn vào một tập tin. Nếu đầu ra được chuyển hướng đến một tệp không tồn tại, lệnh sẽ tạo một tệp mới có tên đó và lưu đầu ra được chuyển hướng vào đó.

Các lệnh có một dấu ngoặc nhọn sẽ ghi đè lên nội dung hiện có của tệp đích:

  • > - đầu ra tiêu chuẩn
  • < — стандартный ввод
  • 2> - lỗi tiêu chuẩn

Các lệnh có dấu ngoặc nhọn không ghi đè lên nội dung của tệp đích:

  • >> - đầu ra tiêu chuẩn
  • << — стандартный ввод
  • 2>> - lỗi tiêu chuẩn

Hãy xem xét ví dụ sau:

con mèo > write_to_me.txt
Một
b
c
ctrl-d

Ví dụ này sử dụng lệnh cat để ghi kết quả đầu ra vào một tệp.

Xem lại nội dung của write_to_me.txt:

mèo write_to_me.txt

Lệnh sẽ trả về:

Chuyển hướng cat đến write_to_me.txt một lần nữa và nhập ba số.

con mèo > write_to_me.txt
1
2
3
ctrl-d

Bây giờ hãy kiểm tra nội dung của tập tin.

mèo write_to_me.txt

Lệnh sẽ trả về:

Như bạn có thể thấy, tệp chỉ chứa đầu ra mới nhất vì lệnh chuyển hướng đầu ra đã sử dụng một dấu ngoặc nhọn.

Bây giờ hãy thử chạy lệnh tương tự với hai dấu ngoặc nhọn:

con mèo >> write_to_me.txt
Một
b
c
ctrl-d

Mở write_to_me.txt:

1
2
3
Một
b
c

Các lệnh có dấu ngoặc nhọn không ghi đè lên nội dung hiện có mà chỉ thêm vào nội dung đó.

Băng tải

Các ống chuyển hướng đầu ra của một lệnh này sang đầu vào của lệnh khác. Trong trường hợp này, dữ liệu được truyền sang chương trình thứ hai không được hiển thị trong thiết bị đầu cuối. Dữ liệu sẽ chỉ xuất hiện trên màn hình sau khi được chương trình thứ hai xử lý.

Các đường dẫn trong Linux được biểu thị bằng một thanh dọc.

Ví dụ:

Lệnh này sẽ chuyển đầu ra của ls (nội dung của thư mục hiện tại) sang less, lệnh này sẽ hiển thị dữ liệu được truyền đến nó theo từng dòng. Thông thường, ls hiển thị nội dung của các thư mục một cách liên tục mà không chia chúng thành dòng. Nếu bạn chuyển hướng đầu ra ls sang less, lệnh sau sẽ chia đầu ra thành các dòng.

Như bạn có thể thấy, một đường dẫn có thể chuyển hướng đầu ra của một lệnh sang đầu vào của lệnh khác, không giống như > và >> chỉ chuyển hướng dữ liệu đến các tệp.

Bộ lọc

Bộ lọc là các lệnh có thể thay đổi chuyển hướng và đầu ra của đường dẫn.

Ghi chú: Bộ lọc cũng là các lệnh Linux tiêu chuẩn có thể được sử dụng mà không cần đường dẫn.

  • find – tìm kiếm một tập tin theo tên.
  • grep – tìm kiếm văn bản bằng một mẫu nhất định.
  • tee – chuyển hướng đầu vào tiêu chuẩn sang đầu ra tiêu chuẩn và một hoặc nhiều tệp.
  • tr – tìm kiếm và thay thế chuỗi.
  • wc – đếm ký tự, dòng và từ.

Ví dụ về chuyển hướng I/O

Bây giờ bạn đã quen với các khái niệm và cơ chế chuyển hướng cơ bản, hãy xem một số ví dụ cơ bản về cách sử dụng chúng.

lệnh> tập tin

Mẫu này chuyển hướng đầu ra tiêu chuẩn của lệnh tới một tệp.

ls ~> root_dir_contents.txt

Lệnh này chuyển nội dung của thư mục gốc của hệ thống dưới dạng đầu ra tiêu chuẩn và ghi đầu ra vào tệp root_dir_contents. Thao tác này sẽ xóa tất cả nội dung trước đó trong tệp vì lệnh sử dụng một dấu ngoặc nhọn.

lệnh>/dev/null

/dev/null là một tệp đặc biệt (được gọi là "thiết bị null") được sử dụng để ngăn chặn đầu ra tiêu chuẩn hoặc chẩn đoán nhằm tránh đầu ra bảng điều khiển không mong muốn. Tất cả dữ liệu kết thúc bằng /dev/null sẽ bị loại bỏ. Chuyển hướng đến /dev/null thường được sử dụng trong các tập lệnh shell.

ls > /dev/null

Lệnh này đặt lại đầu ra tiêu chuẩn được ls trả về thành /dev/null.

lệnh 2> tập tin

Mẫu này chuyển hướng luồng lỗi tiêu chuẩn của lệnh tới một tệp, ghi đè nội dung hiện tại của nó.

mkdir "" 2> mkdir_log.txt

Lệnh này sẽ chuyển hướng lỗi do tên thư mục không hợp lệ gây ra và ghi nó vào log.txt. Xin lưu ý: lỗi vẫn xuất hiện trong terminal.

lệnh >> tập tin

Mẫu này chuyển hướng đầu ra tiêu chuẩn của lệnh sang tệp mà không ghi đè nội dung hiện tại của tệp.

echo Được ghi vào một tệp mới > data.txt
echo Đã thêm vào nội dung của tệp hiện có >> data.txt

Cặp lệnh này trước tiên chuyển hướng đầu vào của người dùng sang một tệp mới, sau đó dán nó vào một tệp hiện có mà không ghi đè lên nội dung của nó.

lệnh 2>>tập tin

Mẫu này chuyển hướng luồng lỗi tiêu chuẩn của lệnh tới một tệp mà không ghi đè lên nội dung hiện có của tệp. Nó phù hợp để tạo nhật ký lỗi chương trình hoặc dịch vụ vì nội dung nhật ký sẽ không được cập nhật liên tục.

tìm "" 2> stderr_log.txt
wc "" 2>> stderr_log.txt

Lệnh trên chuyển hướng thông báo lỗi do đối số find không hợp lệ gây ra vào tệp stderr_log.txt và sau đó nối thêm thông báo lỗi do đối số wc không hợp lệ gây ra vào tệp stderr_log.txt.

đội | đội

Mẫu này chuyển hướng đầu ra tiêu chuẩn của lệnh đầu tiên sang đầu vào tiêu chuẩn của lệnh thứ hai.

tìm /var lib | lỗi grep

Lệnh này tìm kiếm thư mục /var và các thư mục con của nó để tìm tên tệp và phần mở rộng gỡ lỗi, đồng thời trả về đường dẫn tệp, đánh dấu mẫu tìm kiếm bằng màu đỏ.

đội | tập tin tee

Mẫu này chuyển hướng đầu ra tiêu chuẩn của lệnh sang một tệp và ghi đè nội dung của nó, sau đó hiển thị đầu ra được chuyển hướng trong thiết bị đầu cuối. Nếu tệp được chỉ định không tồn tại, nó sẽ tạo một tệp mới.

Trong mẫu này, lệnh tee thường được sử dụng để xem đầu ra của chương trình và lưu nó vào một tệp cùng một lúc.

wc /etc/magic | tee magic_count.txt

Lệnh này chuyển số ký tự, dòng và từ trong tệp ma thuật (Linux sử dụng điều này để xác định loại tệp) tới lệnh tee, lệnh này sẽ gửi dữ liệu này đến thiết bị đầu cuối và tới tệp magic_count.txt.

đội | đội | lệnh >> tập tin

Mẫu này chuyển hướng đầu ra tiêu chuẩn của lệnh đầu tiên và lọc nó qua hai lệnh tiếp theo, sau đó nối kết quả cuối cùng vào một tệp.

ls ~ | grep *tar | tr e E >> ls_log.txt

Lệnh này gửi đầu ra của ls cho thư mục gốc tới grep. Đổi lại, grep tìm kiếm dữ liệu nhận được cho các tệp tar. Sau đó, kết quả của grep được truyền cho lệnh tr, lệnh này sẽ thay thế tất cả các ký tự e bằng ký tự E. Kết quả thu được sẽ được thêm vào tệp ls_log.txt (nếu tệp đó không tồn tại, lệnh sẽ tạo nó tự động).

Phần kết luận

Lúc đầu, các chức năng chuyển hướng I/O của Linux có vẻ quá phức tạp. Tuy nhiên, làm việc với chuyển hướng là một trong những kỹ năng quan trọng nhất của quản trị viên hệ thống.

Để tìm hiểu thêm về một lệnh cụ thể, hãy sử dụng:

lệnh người đàn ông | ít hơn

Ví dụ:

Lệnh này sẽ trả về danh sách đầy đủ các lệnh cho tee.

thẻ:

Theo mặc định, trong hệ thống, ba “tệp” luôn mở - (bàn phím), (màn hình) và (hiển thị thông báo lỗi trên màn hình). Những tệp này và bất kỳ tệp đang mở nào khác đều có thể được chuyển hướng. Trong trường hợp này, thuật ngữ "chuyển hướng" có nghĩa là lấy đầu ra từ một tệp, lệnh, chương trình, tập lệnh hoặc thậm chí một khối đơn lẻ trong tập lệnh (xem Ví dụ 3-1 và Ví dụ 3-2) và chuyển nó làm đầu vào cho một tập tin, lệnh, chương trình hoặc tập lệnh khác.

Mỗi tệp đang mở có một bộ mô tả tệp được liên kết với nó. Các bộ mô tả tệp và lần lượt là 0, 1 và 2. Khi mở các tệp bổ sung, bộ mô tả từ 3 đến 9 vẫn chưa được sử dụng. Đôi khi các bộ mô tả bổ sung có thể thực hiện tốt công việc, lưu trữ tạm thời một liên kết đến hoặc. Điều này giúp dễ dàng đưa các điều khiển về trạng thái bình thường sau các thao tác chuyển hướng và hoán đổi phức tạp (xem Ví dụ 16-1).

COMMAND_OUTPUT > # Chuyển hướng thiết bị xuất chuẩn (đầu ra) sang một tệp. # Nếu thiếu file, nó sẽ được tạo, nếu không sẽ bị ghi đè. ls -lR > dir-tree.list # Tạo một tệp chứa danh sách cây thư mục. : > tên tệp # Thao tác > cắt bớt "tên tệp" của tệp thành độ dài bằng 0. # Nếu tệp không tồn tại trước thao tác, # thì một tệp mới có độ dài bằng 0 sẽ được tạo (lệnh "touch" có tác dụng tương tự). # Ký hiệu: đóng vai trò giữ chỗ ở đây, không xuất ra bất cứ thứ gì. > tên tệp # Thao tác > cắt bớt "tên tệp" của tệp thành độ dài bằng 0. # Nếu tệp không tồn tại trước thao tác, # thì một tệp mới có độ dài bằng 0 sẽ được tạo (lệnh "touch" có tác dụng tương tự). # (kết quả tương tự như ":>" ở trên, nhưng tùy chọn này không hoạt động # trong một số shell.) COMMAND_OUTPUT >> # Chuyển hướng thiết bị xuất chuẩn (đầu ra) sang một tệp. # Tạo một tệp mới nếu nó bị thiếu, nếu không thì sẽ thêm nó vào cuối tệp. # Các lệnh chuyển hướng một dòng # (chỉ ảnh hưởng đến dòng mà chúng xuất hiện): # ————————————————————————— 1>tên tệp # Đầu ra chuyển hướng (thiết bị xuất chuẩn) ) vào tệp "tên tệp". 1>>tên tệp # Chuyển hướng đầu ra (stdout) sang tệp "tên tệp", tệp được mở ở chế độ chắp thêm. 2>tên tệp # Chuyển hướng stderr sang tệp "tên tệp". 2>>tên tệp # Chuyển hướng stderr sang tệp "tên tệp", tệp được mở ở chế độ chắp thêm. &>tên tệp # Chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn sang tệp "tên tệp". #===================================================== == ================================ # Chuyển hướng thiết bị xuất chuẩn, chỉ cho một dòng. LOGFILE=script.log echo "Dòng này sẽ được ghi vào tập tin \"$LOGFILE\"." 1>$LOGFILE echo "Dòng này sẽ được thêm vào cuối tập tin \"$LOGFILE\"." 1>>$LOGFILE echo "Dòng này cũng sẽ được thêm vào cuối tập tin \"$LOGFILE\"." 1>>$LOGFILE echo "Dòng này sẽ được in ra màn hình và sẽ không xuất hiện trong tập tin \"$LOGFILE\"." # Sau mỗi dòng, chuyển hướng được thực hiện sẽ tự động được đặt lại. # Chuyển hướng stderr, chỉ cho một dòng. ERRORFILE=script.errors bad_command1 2>$ERRORFILE # Thông báo lỗi sẽ được ghi vào $ERRORFILE. bad_command2 2>>$ERRORFILE # Một thông báo lỗi sẽ được thêm vào cuối $ERRORFILE. bad_command3 # Thông báo lỗi sẽ được in ra stderr, #+ và sẽ không chuyển tới $ERRORFILE. # Sau mỗi dòng, chuyển hướng được thực hiện cũng tự động được đặt lại. #===================================================== ================================ 2>&1 # Chuyển hướng stderr sang stdout. # Thông báo lỗi được gửi đến cùng nơi với đầu ra tiêu chuẩn. tôi> Tôi V. j. # Xuất ra file có mô tả Tôiđược chuyển vào tập tin với bộ mô tả j. >&j # Bộ mô tả tập tin được chuyển hướng 1 (stdout) vào một tệp có bộ mô tả j. # Đầu ra của thiết bị xuất chuẩn được gửi đến bộ mô tả tệp j. 0< FILENAME < FILENAME # Ввод из файла. # Парная команде ">", thường được kết hợp với nó. # # grep search-word tên tệp # Tệp "tên tệp" được mở để đọc và ghi và được liên kết với phần điều khiển "j". # Nếu thiếu "tên tệp", nó sẽ được tạo. # Nếu bộ mô tả "j" không được chỉ định thì bộ mô tả 0, stdin, sẽ được lấy theo mặc định. # # Một cách sử dụng cho việc này là ghi vào một vị trí cụ thể trong một tập tin. echo 1234567890 > Tệp # Viết một chuỗi vào tệp "Tệp". thực hiện 3<>Tệp # Mở "Tệp" và liên kết với phần xử lý 3. read -n 4<&3 # Прочитать 4 символа. echo -n . >&3 # Viết ký tự dấu chấm. exec 3>&- # Đóng xử lý 3. cat File # ==> 1234.67890 # Truy cập ngẫu nhiên, thế thôi! | # Băng tải (kênh). # Một công cụ phổ quát để kết hợp các lệnh thành một chuỗi. # Trông giống như ">", nhưng thực ra rộng hơn. # Được sử dụng để kết hợp các lệnh, tập lệnh, tệp và chương trình thành một chuỗi (đường ống). mèo *.txt | sắp xếp | uniq > result-file # Nội dung của tất cả các tệp .txt được sắp xếp, các dòng trùng lặp được loại bỏ, # kết quả được lưu trong tệp "tệp kết quả".

Các hoạt động chuyển hướng và/hoặc đường dẫn có thể được kết hợp trên cùng một dòng lệnh.

yêu cầu< input-file >lệnh tập tin đầu ra1 | lệnh2 | command3 > tệp đầu ra Xem Ví dụ 12-23 và Ví dụ A-17.

Có thể chuyển hướng nhiều luồng đến một tệp.

ls -yz >> command.log 2>&1 # Một thông báo về tùy chọn "yz" không hợp lệ trong lệnh "ls" sẽ được ghi vào tệp "command.log". # Bởi vì stderr được chuyển hướng đến một tập tin.

Đóng các thẻ xử lý tập tin

Đóng bộ mô tả tập tin đầu vào.

0<&-, <&-

Đóng bộ mô tả tập tin đầu ra.

1>&-, >&-

Tiến trình con kế thừa các thẻ điều khiển tệp đang mở. Đây là lý do tại sao băng tải hoạt động. Để ngăn việc kế thừa các thẻ điều khiển, hãy đóng chúng trước khi bắt đầu tiến trình con.

# Chỉ có stderr được chuyển vào đường ống. exec 3>&1 # Lưu "trạng thái" hiện tại vào thiết bị xuất chuẩn. ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Đóng desc. 3 cho "grep" (nhưng không phải cho "ls"). # ^^ ^^ ^^ ^^ exec 3>&- # Bây giờ hãy đóng nó lại để xem phần còn lại của tập lệnh. # Cảm ơn S.C.

Để biết thêm thông tin về chuyển hướng I/O, hãy xem Phụ lục D.

16.1. Sử dụng lệnh người điều hành

Đội người điều hành chuyển hướng đầu vào từ một tập tin. Từ giờ trở đi, tất cả đầu vào, thay vì (thường là bàn phím), sẽ được tạo từ tệp này. Điều này cho phép đọc nội dung của tệp, từng dòng và phân tích từng dòng được nhập bằng sed và/hoặc awk.

Ví dụ 16-1. Chuyển hướng với exec

#!/bin/bash # Chuyển hướng stdin bằng "exec". thực hiện 6<&0 # Связать дескр. #6 со стандартным вводом (stdin). # Сохраняя stdin. exec < data-file # stdin заменяется файлом "data-file" read a1 # Читается первая строка из "data-file". read a2 # Читается вторая строка из "data-file." echo echo "Следующие строки были прочитаны из файла." echo "——————————————" echo $a1 echo $a2 echo; echo; echo exec 0<&6 6<&- # Восстанавливается stdin из дескр. #6, где он был предварительно сохранен, #+ и дескр. #6 закрывается (6<&-) освобождая его для других процессов. # # <&6 6<&- дает тот же результат. echo -n "Введите строку " read b1 # Теперь функция "read", как и следовало ожидать, принимает данные с обычного stdin. echo "Строка, принятая со stdin." echo "—————————" echo "b1 = $b1" echo exit 0

Tương tự như vậy, việc thiết kế thực thi >tên tệp chuyển hướng đầu ra đến tập tin được chỉ định. Sau đó, tất cả đầu ra từ các lệnh thường được chuyển hướng đến giờ sẽ được xuất ra tệp này.

Ví dụ 16-2. Chuyển hướng với exec

#!/bin/bash # resign-stdout.sh LOGFILE=logfile.txt exec 6>&1 # Liên kết desc. #6 với thiết bị xuất chuẩn. # Lưu trữ thiết bị xuất chuẩn. exec > $LOGFILE # stdout được thay thế bằng tệp "logfile.txt". # ————————————————————— # # Tất cả đầu ra từ các lệnh trong khối này được ghi vào tệp $LOGFILE. echo -n "Logfile: " date echo "—————————————-" echo echo "Đầu ra của \"ls -al\"" echo ls -al echo; echo echo "Đầu ra của lệnh \"df\"" echo df # ———————————————————— # exec 1>&6 6>&- # Khôi phục thiết bị xuất chuẩn và đóng tập tin. #6. echo echo "== stdout được khôi phục về mặc định == " echo ls -al echo exit 0

Ví dụ 16-3. Chuyển hướng đồng thời các thiết bị và sử dụng lệnh exec

#!/bin/bash # Upperconv.sh # Chuyển đổi các ký tự trong tệp đầu vào thành chữ hoa. E_FILE_ACCESS=70 E_WRONG_ARGS=71 nếu [ ! -r "$1" ] # Tập tin có đọc được không? sau đó lặp lại "Không thể đọc từ tệp được chỉ định!" echo "Cách sử dụng: $0 tệp đầu vào tệp đầu ra" exit $E_FILE_ACCESS fi # Trong trường hợp tệp đầu vào ($1) không được chỉ định #+ mã thoát sẽ giống nhau. if [ -z "$2" ] thì echo "Tệp đầu ra phải được chỉ định." echo "Cách sử dụng: $0 tệp đầu vào tệp đầu ra" thoát $E_WRONG_ARGS fi exec 4<&0 exec < $1 # Назначить ввод из входного файла. exec 7>&1 exec > $2 # Gán đầu ra cho một tệp đầu ra. # Giả sử tập tin đầu ra có thể ghi được # (thêm kiểm tra?). # ————————————————— mèo — | tr a-z A-Z # Chuyển sang chữ hoa # ^^^^ # Đọc từ stdin. # ^^ ^^ ^^ ^^ ^^ # Viết vào thiết bị xuất chuẩn. # Tuy nhiên, cả stdin và stdout đều được chuyển hướng. # ———————————————— exec 1>&7 7>&- # Khôi phục thiết bị xuất chuẩn. thực thi 0<&4 4<&- # Восстановить stdin. # После восстановления, следующая строка выводится на stdout, чего и следовало ожидать. echo "Символы из \"$1\" преобразованы в верхний регистр, результат записан в \"$2\"." exit 0

Kế tiếp: Chuyển hướng lỗi sang một tập tin Hướng lên: Chuyển hướng I/O Trước: Chuyển hướng đầu vào từ một tập tin Nội dung Mục lục

Chuyển hướng đầu ra sang một tập tin

Để chuyển hướng đầu ra tiêu chuẩn tới một tập tin, hãy dùng toán tử `>'.

Chuyển hướng I/O trong Linux

Thực hiện theo tên lệnh với toán tử >, theo sau là tên của tệp sẽ đóng vai trò là đích cho đầu ra. Ví dụ: để ghi đầu ra của chương trình vào một tệp, hãy nhập:

Nếu bạn chuyển hướng đầu ra tiêu chuẩn sang một tệp đã có sẵn, nó sẽ bị ghi đè ngay từ đầu. Để nối thêm đầu ra tiêu chuẩn vào nội dung của một tập tin hiện có, bạn phải sử dụng toán tử `"'. Ví dụ, để thêm kết quả công việc khi chạy lại chương trình vào một file, hãy nhập:

Alex Otwagin 2002-12-16

Một chương trình thường có giá trị vì nó có thể xử lý dữ liệu: chấp nhận một thứ, tạo ra một thứ khác làm đầu ra và hầu hết mọi thứ đều có thể hoạt động như dữ liệu: văn bản, số, âm thanh, video... Các luồng dữ liệu đầu vào và đầu ra cho một lệnh được gọi là đầu vàoPhần kết luận. Mỗi chương trình có thể có nhiều luồng đầu vào và đầu ra. Mỗi tiến trình khi được tạo ra nhất thiết phải nhận được cái gọi là đầu vào tiêu chuẩn(đầu vào tiêu chuẩn, stdin) và đầu ra tiêu chuẩn(đầu ra tiêu chuẩn, thiết bị xuất chuẩn) và đầu ra lỗi tiêu chuẩn(lỗi tiêu chuẩn, stderr).

Các luồng đầu vào/đầu ra tiêu chuẩn chủ yếu nhằm mục đích trao đổi thông tin văn bản. Ai giao tiếp qua văn bản thậm chí không quan trọng: một người có chương trình hoặc các chương trình giữa họ - điều chính là họ có kênh truyền dữ liệu và họ nói “cùng một ngôn ngữ”.

Nguyên tắc văn bản khi làm việc với máy cho phép bạn thoát khỏi các bộ phận cụ thể của máy tính, chẳng hạn như bàn phím hệ thống và card màn hình với màn hình, nhìn vào một phần duy nhất. thiết bị đầu cuối, qua đó người dùng nhập văn bản (lệnh) và truyền đến hệ thống, đồng thời hệ thống hiển thị dữ liệu và thông báo mà người dùng yêu cầu (chẩn đoán và lỗi). Một thiết bị như vậy được gọi là phần cuối. Nói chung, thiết bị đầu cuối là điểm truy cập của người dùng vào hệ thống có khả năng truyền thông tin văn bản. Thiết bị đầu cuối có thể là một thiết bị bên ngoài riêng biệt được kết nối với máy tính thông qua cổng dữ liệu nối tiếp (trong máy tính cá nhân, nó được gọi là “cổng COM”). Một chương trình (ví dụ: xterm hoặc ssh) cũng có thể hoạt động như một thiết bị đầu cuối (với một số hỗ trợ từ hệ thống). Cuối cùng, bảng điều khiển ảo- cũng là thiết bị đầu cuối, chỉ được tổ chức theo chương trình bằng cách sử dụng các thiết bị phù hợp của máy tính hiện đại.

Khi làm việc ở dòng lệnh, đầu vào tiêu chuẩn của shell được liên kết với bàn phím, đầu ra tiêu chuẩn và đầu ra lỗi được liên kết với màn hình điều khiển (hoặc cửa sổ trình mô phỏng thiết bị đầu cuối). Hãy hiển thị nó bằng lệnh đơn giản nhất - cat. Thông thường đội con mèođọc dữ liệu từ tất cả các tệp được chỉ định làm tham số của nó và gửi dữ liệu đọc trực tiếp đến đầu ra tiêu chuẩn (thiết bị xuất chuẩn). Vì vậy lệnh

/home/larry/papers# luận án thạc sĩ cuối cùng về lịch sử mèo

sẽ hiển thị nội dung của tệp trước và sau đó là tệp.

Tuy nhiên, nếu tên tệp không được chỉ định, chương trình con mèođọc đầu vào từ stdin và ngay lập tức trả nó về thiết bị xuất chuẩn (mà không sửa đổi nó theo bất kỳ cách nào). Dữ liệu đi qua con mèo như xuyên qua một đường ống. Hãy đưa ra một ví dụ:

/home/larry/papers# cat Xin chào bạn. Xin chào. Tạm biệt. Tạm biệt. Điều khiểnD/home/larry/papers#

Mỗi dòng được nhập từ bàn phím sẽ ngay lập tức được chương trình con mèo đưa trở lại màn hình. Khi nhập thông tin từ đầu vào tiêu chuẩn, phần cuối của văn bản được báo hiệu bằng cách nhập một tổ hợp phím đặc biệt, thường là Điều khiểnD.

Hãy đưa ra một ví dụ khác. Đội loạiđọc các dòng văn bản đầu vào (cũng từ stdin nếu không có tên tệp nào được chỉ định) và xuất ra một tập hợp các dòng này ở dạng có thứ tự trên thiết bị xuất chuẩn. Hãy kiểm tra hành động của nó.

/home/larry/papers# sắp xếp chuối cà rốt táo Ctrl+D táo chuối cà rốt /home/larry/papers#

Như bạn có thể thấy, sau khi nhấn Điều khiểnD, loại Hiển thị các dòng theo thứ tự bảng chữ cái.

Đầu vào tiêu chuẩn và đầu ra tiêu chuẩn

Giả sử bạn muốn chuyển đầu ra của lệnh sắp xếp sang một tệp để lưu trữ danh sách được sắp xếp theo thứ tự bảng chữ cái trên đĩa. Shell lệnh cho phép bạn chuyển hướng đầu ra tiêu chuẩn của lệnh sang tệp bằng ký hiệu. Hãy đưa ra một ví dụ:

/home/larry/papers#sort > danh sách mua sắm chuối cà rốt táo Điều khiểnD/home/larry/papers#

Bạn có thể thấy rằng đầu ra của lệnh sắp xếp không được in trên màn hình mà được lưu trong một tệp có tên. Hãy hiển thị nội dung của tập tin này:

/home/larry/papers# danh sách mua sắm mèo táo chuối cà rốt /home/larry/papers#

Bây giờ hãy để danh sách không có thứ tự ban đầu ở trong một tệp. Danh sách này có thể được sắp xếp bằng lệnh loại, bằng cách yêu cầu nó đọc từ một tệp nhất định thay vì từ đầu vào tiêu chuẩn của nó, đồng thời chuyển hướng đầu ra tiêu chuẩn sang một tệp, như đã được thực hiện ở trên. Ví dụ:

/home/larry/papers# sắp xếp các mục trong danh sách mua sắm /home/larry/papers# danh sách mua sắm của mèo táo chuối cà rốt /home/larry/papers#

Tuy nhiên, bạn có thể làm điều đó theo cách khác bằng cách chuyển hướng không chỉ đầu ra tiêu chuẩn mà còn đầu vào tiêu chuẩn tiện ích từ tệp bằng ký hiệu:

/home/larry/papers# sắp xếp< items apples bananas carrots /home/larry/papers#

Kết quả lệnh loại< items tương đương với lệnh sắp xếp các mục, tuy nhiên phần đầu tiên thể hiện điều sau: khi ban hành lệnh loại< items hệ thống hoạt động như thể dữ liệu chứa trong tệp được nhập từ đầu vào tiêu chuẩn. Việc chuyển hướng được thực hiện bằng lệnh shell. Đội loại tên tệp không được báo cáo: lệnh này đọc dữ liệu từ đầu vào tiêu chuẩn của nó như thể chúng ta đã nhập nó từ bàn phím.

Hãy giới thiệu khái niệm lọc. Bộ lọc là một chương trình đọc dữ liệu từ đầu vào tiêu chuẩn, xử lý dữ liệu theo cách nào đó và gửi kết quả đến đầu ra tiêu chuẩn. Khi áp dụng chuyển hướng, các tệp có thể được sử dụng làm đầu vào và đầu ra tiêu chuẩn. Như đã nêu ở trên, theo mặc định, stdin và stdout lần lượt đề cập đến bàn phím và màn hình. Chương trình sắp xếp là một bộ lọc đơn giản - nó sắp xếp dữ liệu đầu vào và gửi kết quả đến đầu ra tiêu chuẩn. Một bộ lọc rất đơn giản là chương trình con mèo- nó không làm gì với dữ liệu đầu vào mà chỉ gửi nó đến đầu ra.

Chúng tôi đã trình bày cách sử dụng chương trình sắp xếp làm bộ lọc ở trên. Những ví dụ này giả định rằng dữ liệu nguồn nằm trong một số tệp hoặc dữ liệu nguồn sẽ được nhập từ bàn phím (đầu vào tiêu chuẩn). Tuy nhiên, điều gì sẽ xảy ra nếu bạn muốn sắp xếp dữ liệu là kết quả của một số lệnh khác, ví dụ: ls?

Chúng tôi sẽ sắp xếp dữ liệu theo thứ tự bảng chữ cái ngược lại; việc này được thực hiện bằng tùy chọn lệnh loại. Nếu bạn muốn liệt kê các tập tin trong thư mục hiện tại theo thứ tự bảng chữ cái đảo ngược, một cách để làm điều đó là như sau.

Chuyển hướng I/O

Trước tiên chúng ta hãy sử dụng lệnh ls:

/home/larry/papers# ls tiếng anh-danh sách lịch sử-cuối cùng ghi chú luận án thạc sĩ/home/larry/papers#

Bây giờ chúng tôi chuyển hướng đầu ra lệnh ls vào một tập tin có tên file-list

/home/larry/papers# ls > file-list /home/larry/papers#sort -r file-list ghi chú masters-the history-final English-list /home/larry/papers#

Đây là đầu ra lệnh lsđược lưu trong một tệp và sau đó tệp này được xử lý bằng lệnh loại. Tuy nhiên, đường dẫn này không phù hợp và yêu cầu sử dụng tệp tạm thời để lưu trữ đầu ra chương trình ls.

Giải pháp cho tình trạng này có thể là tạo ra lệnh neo(đường ống). Việc gắn kết được thực hiện bởi shell lệnh, lệnh này hướng thiết bị xuất chuẩn của lệnh đầu tiên đến stdin của lệnh thứ hai. Trong trường hợp này, chúng tôi muốn gửi lệnh tới thiết bị xuất chuẩn ls tới các lệnh stdin loại. Một biểu tượng được sử dụng để gắn đế, như trong ví dụ sau:

/home/larry/papers# ls | sắp xếp -r ghi chú thạc sĩ-luận văn lịch sử-cuối cùng danh sách tiếng anh /home/larry/papers#

Lệnh này ngắn hơn một tập hợp các lệnh và dễ gõ hơn.

Hãy xem một ví dụ hữu ích khác. Đội

/home/larry/papers# ls /usr/bin

trả về một danh sách dài các tập tin. Hầu hết danh sách này lướt qua màn hình quá nhanh để có thể đọc được nội dung của danh sách này. Hãy thử sử dụng lệnh more để hiển thị danh sách này theo từng phần:

/home/larry/papers# ls /usr/bin | hơn

Bây giờ bạn có thể “lướt qua” danh sách này.

Bạn có thể đi xa hơn và cập bến nhiều hơn hai đội. Hãy xem xét đội cái đầu, là một bộ lọc có thuộc tính sau: nó xuất ra những dòng đầu tiên từ luồng đầu vào (trong trường hợp của chúng tôi, đầu vào sẽ là đầu ra từ một số lệnh được nối). Nếu chúng ta muốn hiển thị tên tệp theo thứ tự bảng chữ cái cuối cùng trong thư mục hiện tại, chúng ta có thể sử dụng lệnh dài sau:

/home/larry/papers# ls | sắp xếp -r | đầu -1 ghi chú /home/larry/papers\#

đội ở đâu cái đầu hiển thị dòng đầu tiên của luồng đầu vào của các dòng mà nó nhận được (trong trường hợp của chúng tôi, luồng bao gồm dữ liệu từ lệnh ls), được sắp xếp theo thứ tự bảng chữ cái đảo ngược.

Sử dụng các lệnh xếp chồng (đường ống)

Tác dụng của việc sử dụng biểu tượng để chuyển hướng đầu ra của tệp là có hại; nói cách khác, đội

/home/larry/papers# ls > danh sách tập tin

sẽ hủy nội dung của tệp nếu tệp đã tồn tại trước đó và tạo một tệp mới vào vị trí của nó.

Thay vào đó, nếu việc chuyển hướng được thực hiện bằng cách sử dụng các ký hiệu thì đầu ra sẽ được thêm vào cuối tệp được chỉ định mà không phá hủy nội dung gốc của tệp. Ví dụ, lệnh

/home/larry/papers# ls >> danh sách tập tin

thuộc tính đầu ra của lệnh lsđến cuối tập tin.

Hãy nhớ rằng việc chuyển hướng đầu vào và đầu ra cũng như nối lệnh được thực hiện bởi các shell hỗ trợ việc sử dụng các ký hiệu và. Bản thân các đội không có khả năng nhận thức và giải thích những biểu tượng này.

Chuyển hướng đầu ra không phá hủy

Một cái gì đó như thế này sẽ làm những gì bạn cần?

Kiểm tra nó ra: wintee

Không cần Cygwin.

Tuy nhiên, tôi đã gặp phải và báo cáo một số vấn đề.

Ngoài ra, bạn có thể muốn xem http://unxutils.sourceforge.net/ vì nó chứa tee (và không cần cygwin), nhưng hãy cẩn thận rằng đầu ra EOL giống UNIX.

Cuối cùng nhưng không kém phần quan trọng, nếu có PowerShell, bạn có thể dùng thử Tee-Object. Nhập vào bảng điều khiển PowerShell để biết thêm thông tin.

Điều này hoạt động, mặc dù nó hơi xấu:

Nó linh hoạt hơn một số giải pháp khác một chút ở chỗ nó hoạt động theo cách riêng nên bạn có thể sử dụng để bổ sung.

Tôi sử dụng điều này khá nhiều trong các tệp bó để ghi nhật ký và hiển thị thông báo:

Có, bạn có thể chỉ cần lặp lại câu lệnh ECHO (một lần cho màn hình và lần thứ hai chuyển hướng đến tệp nhật ký), nhưng điều đó trông cũng tệ như vậy và là một vấn đề bảo trì.

Chuyển hướng đầu vào và đầu ra

Ít nhất bằng cách này, bạn không phải thực hiện thay đổi đối với tin nhắn ở hai nơi.

Lưu ý rằng _ chỉ là một tên tệp ngắn, vì vậy bạn sẽ cần xóa nó ở cuối tệp bó (nếu bạn đang sử dụng tệp bó).

Thao tác này sẽ tạo một tệp nhật ký với thời gian và thời gian hiện tại và bạn có thể sử dụng các dòng console trong quá trình này

Nếu bạn có cygwin trong đường dẫn môi trường Windows, bạn có thể sử dụng:

Một ứng dụng bảng điều khiển C# đơn giản sẽ thực hiện thủ thuật:

Để sử dụng điều này, bạn chỉ cần chuyển lệnh nguồn tới chương trình và chỉ định đường dẫn đến bất kỳ tệp nào mà bạn muốn sao chép đầu ra. Ví dụ:

Sẽ hiển thị kết quả tìm kiếm và cũng lưu kết quả trong files1.txt và files2.txt.

Lưu ý rằng không có nhiều cách xử lý lỗi (không có gì!) và việc hỗ trợ nhiều tệp có thể không cần thiết.

Tôi cũng đang tìm giải pháp tương tự, sau một chút thử tôi đã có thể thực hiện thành công việc này trên dòng lệnh. Đây là giải pháp của tôi:

Nó thậm chí còn chiếm quyền điều khiển bất kỳ lệnh PAUSE nào.

Một cách khác là chuyển thiết bị xuất chuẩn sang thiết bị xuất chuẩn trong chương trình của bạn:

Sau đó, trong tệp bó dos của bạn:

Stdout sẽ đi tới tệp nhật ký và stderr (cùng dữ liệu) sẽ được hiển thị trên bảng điều khiển.

Cách hiển thị và chuyển hướng đầu ra sang một tập tin. Giả sử nếu tôi sử dụng lệnh dos, dir> test.txt thì lệnh này sẽ chuyển hướng đầu ra sang file test.txt mà không hiển thị kết quả. cách viết lệnh in đầu ra và chuyển hướng đầu ra sang một tệp bằng DOS, tức là dòng lệnh Windows, không phải UNIX/LINUX.

Bạn có thể thấy các lệnh này trong biterscripting (http://www.biterscripting.com) hữu ích.

Đây là một biến thể của câu trả lời trước của MTS, tuy nhiên nó bổ sung một số tính năng có thể hữu ích cho những tính năng khác. Đây là phương pháp tôi đã sử dụng:

  • Lệnh được đặt làm biến có thể được sử dụng sau này trong mã để xuất ra cửa sổ lệnh và được thêm vào tệp nhật ký bằng cách sử dụng
    • lệnh tránh chuyển hướng bằng biểu tượng củ cà rốt để ban đầu các lệnh không được đánh giá
  • Một tệp tạm thời được tạo với tên tệp tương tự như tên tệp bó sử dụng cú pháp mở rộng tùy chọn dòng lệnh để lấy tên của tệp bó.
  • Kết quả được thêm vào một tệp nhật ký riêng

Đây là chuỗi lệnh:

  1. Thông báo đầu ra và lỗi được gửi đến một tệp tạm thời
  2. Nội dung của tệp tạm thời là:
    • đã thêm vào tệp nhật ký
    • xuất ra cửa sổ lệnh
  3. Tệp tạm thời có tin nhắn bị xóa

Đây là một ví dụ:

Bằng cách này, lệnh có thể được thêm vào sau các lệnh sau trong một tệp bó, trông gọn gàng hơn nhiều:

Điều này cũng có thể được thêm vào cuối các lệnh khác. Theo như tôi có thể nói thì điều này sẽ hoạt động khi tin nhắn có nhiều dòng. Ví dụ: lệnh sau in hai dòng nếu có thông báo lỗi:

Tôi đồng ý với Brian Rasmussen, cổng unxutils là cách dễ nhất để thực hiện việc này. Trong phần Tệp hàng loạt trên các trang Tập lệnh của mình, Rob van der Woude cung cấp rất nhiều thông tin về cách sử dụng các lệnh MS-DOS và CMD. Tôi nghĩ rằng nó có thể có giải pháp riêng cho vấn đề của bạn và sau khi tìm hiểu TEE.BAT ở đó, tôi đã tìm thấy TEE.BAT, có vẻ như chỉ có vậy, một gói ngôn ngữ MS-DOS được đóng gói. Đây là một tệp bó khá phức tạp và tôi có xu hướng sử dụng cổng unxutils.

Tôi cài đặt Perl trên hầu hết các máy của mình, vì vậy câu trả lời là sử dụng Perl: tee.pl

thư mục | perl tee.pl hoặc danh mục | perl tee.pl dir.bat

thô và chưa được kiểm tra.

Bạn đã quen với hai phương pháp làm việc với đầu ra của tập lệnh dòng lệnh:

  • Hiển thị dữ liệu đầu ra trên màn hình.
  • Chuyển hướng đầu ra sang một tập tin.
Đôi khi bạn cần hiển thị nội dung nào đó trên màn hình và ghi nội dung nào đó vào tệp, vì vậy bạn cần hiểu cách Linux xử lý đầu vào và đầu ra, nghĩa là học cách gửi kết quả của tập lệnh đến nơi bạn cần. Hãy bắt đầu bằng cách nói về các bộ mô tả tệp tiêu chuẩn.

Bộ mô tả tập tin tiêu chuẩn

Mọi thứ trong Linux đều là tệp, bao gồm cả đầu vào và đầu ra. Hệ điều hành xác định các tệp bằng cách sử dụng bộ mô tả tệp.

Mỗi tiến trình được phép có tối đa chín thẻ điều khiển tệp đang mở. Shell bash dành ba thẻ điều khiển đầu tiên có ID 0, 1 và 2. Đây là ý nghĩa của chúng.

  • 0 , STDIN - luồng đầu vào tiêu chuẩn.
  • 1, STDOUT - luồng đầu ra tiêu chuẩn.
  • 2, STDERR - luồng lỗi tiêu chuẩn.
Ba tay cầm đặc biệt này xử lý đầu vào và đầu ra của tập lệnh.
Bạn cần thực sự hiểu các luồng tiêu chuẩn. Chúng có thể được so sánh với nền tảng xây dựng sự tương tác của chữ viết với thế giới bên ngoài. Chúng ta hãy xem chi tiết về họ.

STDIN

STDIN là luồng đầu vào tiêu chuẩn của shell. Đối với thiết bị đầu cuối, đầu vào tiêu chuẩn là bàn phím. Khi tập lệnh sử dụng ký tự chuyển hướng đầu vào -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Nhiều lệnh bash chấp nhận đầu vào từ STDIN trừ khi dòng lệnh chỉ định một tệp để lấy dữ liệu. Ví dụ, điều này đúng với lệnh cat.

Khi bạn nhập lệnh cat tại dòng lệnh mà không chỉ định bất kỳ tham số nào, nó sẽ chấp nhận đầu vào từ STDIN. Sau khi bạn nhập dòng tiếp theo, cat chỉ cần hiển thị nó trên màn hình.

TIÊU CHUẨN

STDOUT là luồng đầu ra tiêu chuẩn của shell. Theo mặc định đây là màn hình. Hầu hết các lệnh bash đều xuất dữ liệu sang STDOUT, khiến nó xuất hiện trong bảng điều khiển. Dữ liệu có thể được chuyển hướng đến một tệp bằng cách thêm nó vào nội dung của nó bằng lệnh >>.

Vì vậy, chúng tôi có một tệp dữ liệu mà chúng tôi có thể thêm nhiều dữ liệu hơn bằng lệnh này:

Pwd >> tập tin của tôi
Đầu ra pwd nào sẽ được thêm vào tệp myfile , nhưng dữ liệu đã có trong đó sẽ không đi đâu cả.

Chuyển hướng đầu ra lệnh sang một tập tin

Cho đến nay mọi thứ đều ổn, nhưng điều gì sẽ xảy ra nếu bạn cố gắng thực hiện điều gì đó như sau bằng cách truy cập vào một xfile không tồn tại, tất cả đều được thiết kế để gửi thông báo lỗi tới myfile.

Ls –l xfile > myfile
Sau khi thực hiện lệnh này, chúng ta sẽ thấy thông báo lỗi trên màn hình.


Đang cố gắng truy cập một tập tin không tồn tại

Đã xảy ra lỗi khi cố gắng truy cập một tệp không tồn tại nhưng trình bao không chuyển hướng các thông báo lỗi đến tệp bằng cách in chúng ra màn hình. Nhưng chúng tôi muốn các thông báo lỗi được đưa vào tệp. Phải làm gì? Câu trả lời rất đơn giản - hãy sử dụng bộ mô tả tiêu chuẩn thứ ba.

STDERR

STDERR là luồng lỗi tiêu chuẩn của shell. Theo mặc định, phần điều khiển này trỏ đến cùng một thứ mà STDOUT trỏ tới, đó là lý do tại sao chúng ta thấy thông báo trên màn hình khi xảy ra lỗi.

Vì vậy, giả sử chúng ta muốn chuyển hướng các thông báo lỗi đến một tệp nhật ký hoặc một nơi nào khác, thay vì in chúng ra màn hình.

▍Chuyển hướng luồng lỗi

Như các bạn đã biết, file xử lý STDERR là 2. Chúng ta có thể chuyển hướng lỗi bằng cách đặt phần xử lý này trước lệnh chuyển hướng:

Ls -l xfile 2>myfile cat ./myfile
Thông báo lỗi bây giờ sẽ chuyển đến myfile.


Chuyển hướng thông báo lỗi tới một tập tin

▍Chuyển hướng lỗi và luồng đầu ra

Khi viết các tập lệnh dòng lệnh, có thể có những trường hợp bạn cần chuyển hướng cả thông báo lỗi và đầu ra tiêu chuẩn. Để đạt được điều này, bạn cần sử dụng các lệnh chuyển hướng cho các bộ mô tả thích hợp, chỉ định các tệp sẽ xảy ra lỗi và đầu ra tiêu chuẩn:

Ls –l myfile xfile anotherfile 2> nội dung lỗi 1> nội dung chính xác

Lỗi chuyển hướng và đầu ra tiêu chuẩn

Shell sẽ chuyển hướng những gì lệnh ls thường gửi tới STDOUT vào tệp nội dung chính xác nhờ cấu trúc 1>. Các thông báo lỗi chuyển đến STDERR sẽ xuất hiện trong tệp nội dung lỗi do lệnh chuyển hướng 2>.

Nếu cần, cả STDERR và STDOUT đều có thể được chuyển hướng đến cùng một tệp bằng lệnh &>:


Chuyển hướng STDERR và STDOUT sang cùng một tệp

Sau khi lệnh được thực thi, nội dung dành cho STDERR và STDOUT sẽ xuất hiện trong tệp nội dung.

Chuyển hướng đầu ra trong tập lệnh

Có hai phương pháp để chuyển hướng đầu ra trong tập lệnh dòng lệnh:
  • Chuyển hướng tạm thời hoặc chuyển hướng đầu ra một dòng.
  • Chuyển hướng vĩnh viễn hoặc chuyển hướng tất cả hoặc một phần đầu ra của tập lệnh.

▍Chuyển hướng đầu ra tạm thời

Trong tập lệnh, bạn có thể chuyển hướng đầu ra của một dòng sang STDERR. Để thực hiện việc này, chỉ cần sử dụng lệnh chuyển hướng, chỉ định bộ mô tả STDERR và đặt trước số bộ mô tả bằng ký tự dấu và (&):

#!/bin/bash echo "Đây là lỗi" >&2 echo "Đây là kết quả bình thường"
Nếu bạn chạy tập lệnh, cả hai dòng sẽ xuất hiện trên màn hình, vì như bạn đã biết, theo mặc định, các lỗi được xuất ra ở cùng một vị trí với dữ liệu thông thường.


Chuyển hướng tạm thời

Hãy chạy tập lệnh để đầu ra STDERR chuyển thành một tệp.

./myscript 2> tập tin của tôi
Như bạn có thể thấy, bây giờ đầu ra bình thường được gửi tới bảng điều khiển và các thông báo lỗi sẽ được chuyển đến một tệp.


Thông báo lỗi được ghi vào một tập tin

▍Chuyển hướng đầu ra vĩnh viễn

Nếu tập lệnh của bạn cần chuyển hướng nhiều đầu ra ra màn hình, việc thêm lệnh thích hợp vào mỗi lệnh gọi echo là bất tiện. Thay vào đó, bạn có thể đặt đầu ra được chuyển hướng đến một bộ điều khiển cụ thể trong suốt thời gian của tập lệnh bằng lệnh exec:

#!/bin/bash exec 1>outfile echo "Đây là thử nghiệm chuyển hướng tất cả đầu ra" echo "từ tập lệnh shell sang tập tin khác." echo "mà không cần phải chuyển hướng từng dòng"
Hãy chạy kịch bản.


Chuyển hướng tất cả đầu ra sang một tập tin

Nếu bạn nhìn vào tệp được chỉ định trong lệnh chuyển hướng đầu ra, bạn sẽ thấy rằng mọi thứ được xuất ra bởi lệnh echo đều kết thúc trong tệp đó.

Lệnh exec có thể được sử dụng không chỉ ở đầu tập lệnh mà còn ở những nơi khác:

#!/bin/bash exec 2>myerror echo "Đây là phần bắt đầu của tập lệnh" echo "hiện đang chuyển hướng tất cả đầu ra sang một vị trí khác" exec 1>myfile echo "Cái này sẽ đi tới tập tin myfile" echo "và cái này sẽ đi vào tập tin lỗi của tôi" >&2
Đây là những gì bạn nhận được sau khi chạy tập lệnh và xem các tệp mà chúng tôi đã chuyển hướng đầu ra tới.


Chuyển hướng đầu ra sang các tập tin khác nhau

Lệnh exec trước tiên chuyển hướng đầu ra từ STDERR sang tệp myerror . Đầu ra của một số lệnh echo sau đó được gửi tới STDOUT và được in ra màn hình. Sau đó, lệnh exec khiến mọi nội dung có trong STDOUT được gửi đến tệp myfile và cuối cùng chúng ta sử dụng lệnh chuyển hướng tới STDERR trong lệnh echo, khiến dòng tương ứng được ghi vào tệp myerror.

Khi bạn đã thành thạo điều này, bạn sẽ có thể chuyển hướng đầu ra đến nơi bạn muốn. Bây giờ hãy nói về chuyển hướng đầu vào.

Chuyển hướng đầu vào trong tập lệnh

Để chuyển hướng đầu vào, bạn có thể sử dụng kỹ thuật tương tự mà chúng tôi đã sử dụng để chuyển hướng đầu ra. Ví dụ: lệnh exec cho phép bạn tạo một tệp làm nguồn dữ liệu cho STDIN:

Thực thi 0< myfile
Lệnh này báo cho shell rằng nguồn đầu vào phải là myfile chứ không phải STDIN thông thường. Hãy xem hoạt động chuyển hướng đầu vào:

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
Đây là những gì sẽ xuất hiện trên màn hình sau khi chạy tập lệnh.


Chuyển hướng đầu vào

Trong bài viết trước, bạn đã học cách sử dụng lệnh đọc để đọc dữ liệu nhập của người dùng từ bàn phím. Nếu bạn chuyển hướng đầu vào bằng cách biến nguồn dữ liệu thành một tệp, thì lệnh đọc, khi cố đọc dữ liệu từ STDIN, sẽ đọc dữ liệu từ tệp chứ không phải từ bàn phím.

Một số quản trị viên Linux sử dụng phương pháp này để đọc và xử lý tệp nhật ký.

Tạo chuyển hướng đầu ra của riêng bạn

Bằng cách chuyển hướng đầu vào và đầu ra trong tập lệnh, bạn không bị giới hạn ở ba bộ mô tả tệp tiêu chuẩn. Như đã đề cập, bạn có thể có tối đa chín tay cầm mở. Sáu số còn lại, được đánh số từ 3 đến 8, có thể được sử dụng để chuyển hướng đầu vào hoặc đầu ra. Bất kỳ trong số chúng có thể được gán cho một tệp và được sử dụng trong mã tập lệnh.

Bạn có thể gán một điều khiển cho dữ liệu đầu ra bằng lệnh exec:

#!/bin/bash exec 3>myfile echo "Cái này sẽ hiển thị trên màn hình" echo "và cái này sẽ được lưu trong tập tin" >&3 echo "Và cái này sẽ trở lại trên màn hình"
Sau khi chạy tập lệnh, một phần đầu ra sẽ xuất hiện trên màn hình, một phần - trong tệp có mô tả 3.


Chuyển hướng đầu ra bằng cách sử dụng tay cầm riêng của nó

Tạo bộ mô tả tệp để nhập dữ liệu

Bạn có thể chuyển hướng đầu vào trong tập lệnh giống như cách bạn chuyển hướng đầu ra. Lưu trữ STDIN trong một thẻ điều khiển khác trước khi chuyển hướng đầu vào.

Sau khi đọc file xong, bạn có thể khôi phục STDIN và sử dụng như bình thường:

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Hãy thử kịch bản.


Chuyển hướng đầu vào

Trong ví dụ này, bộ mô tả tệp 6 được sử dụng để lưu trữ tham chiếu đến STDIN. Sau đó, quá trình chuyển hướng đầu vào được thực hiện, tệp trở thành nguồn dữ liệu cho STDIN. Đầu vào của lệnh đọc sau đó đến từ STDIN được chuyển hướng, nghĩa là từ tệp.

Sau khi đọc tệp, chúng tôi đặt lại STDIN bằng cách chuyển hướng nó đến xử lý 6. Bây giờ, để kiểm tra xem mọi thứ có hoạt động chính xác hay không, tập lệnh sẽ hỏi người dùng một câu hỏi, đợi đầu vào bàn phím và xử lý nội dung được nhập.

Đóng các thẻ xử lý tập tin

Shell tự động đóng các phần xử lý tệp sau khi tập lệnh hoàn tất. Tuy nhiên, trong một số trường hợp, cần phải đóng các điều khiển theo cách thủ công trước khi tập lệnh chạy xong. Để đóng một tay cầm, nó phải được chuyển hướng đến &- . Nó trông như thế này:

#!/bin/bash exec 3> myfile echo "Đây là dòng dữ liệu thử nghiệm" >&3 exec 3>&- echo "Nó không hoạt động" >&3
Sau khi thực thi script, chúng ta sẽ nhận được thông báo lỗi.


Đang cố gắng truy cập bộ mô tả tệp đã đóng

Vấn đề là chúng tôi đã cố gắng truy cập một bộ mô tả không tồn tại.

Hãy cẩn thận khi đóng các thẻ xử lý tệp trong tập lệnh. Nếu bạn gửi dữ liệu đến một tệp, sau đó đóng tay cầm, sau đó mở lại, shell sẽ thay thế tệp hiện có bằng một tệp mới. Tức là mọi thứ trước đó được ghi vào tệp này sẽ bị mất.

Nhận thông tin về tay cầm mở

Để có danh sách tất cả các tay cầm đang mở trong Linux, bạn có thể sử dụng lệnh lsof. Trên nhiều bản phân phối, chẳng hạn như Fedora, tiện ích lsof nằm ở /usr/sbin. Lệnh này khá hữu ích vì nó hiển thị thông tin về từng tay cầm đang mở trên hệ thống. Điều này bao gồm những gì được mở bởi các tiến trình chạy trong nền và những gì được mở bởi người dùng đã đăng nhập.

Lệnh này có nhiều phím, hãy xem những phím quan trọng nhất.

  • -p Cho phép bạn chỉ định ID tiến trình.
  • -d Cho phép bạn chỉ định số lượng bộ mô tả mà bạn muốn lấy thông tin.
Để tìm ra PID của quy trình hiện tại, bạn có thể sử dụng biến môi trường đặc biệt $$, trong đó shell ghi PID hiện tại.

Công tắc -a được sử dụng để thực hiện thao tác AND logic trên các kết quả được trả về bằng cách sử dụng hai công tắc còn lại:

Lsof -a -p $$ -d 0,1,2

Hiển thị thông tin về các tay cầm đang mở

Loại tệp được liên kết với STDIN, STDOUT và STDERR là CHR (chế độ ký tự). Vì tất cả chúng đều trỏ đến một thiết bị đầu cuối nên tên tệp khớp với tên của thiết bị được gán cho thiết bị đầu cuối. Tất cả ba tệp tiêu chuẩn đều có thể đọc và ghi được.

Chúng ta hãy xem việc gọi lệnh lsof từ một tập lệnh trong đó, ngoài các tập lệnh tiêu chuẩn, các bộ mô tả khác đều mở:

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Đây là những gì sẽ xảy ra nếu bạn chạy tập lệnh này.


Xem các thẻ điều khiển tệp được mở bằng tập lệnh

Tập lệnh đã mở hai tay cầm cho đầu ra (3 và 6) và một tay cầm cho đầu vào (7). Đường dẫn đến các tệp được sử dụng để định cấu hình bộ mô tả cũng được hiển thị.

Ngăn chặn đầu ra

Đôi khi bạn cần đảm bảo rằng các lệnh trong tập lệnh, chẳng hạn như tập lệnh có thể được thực thi dưới dạng tiến trình nền, không hiển thị bất kỳ thứ gì trên màn hình. Để thực hiện việc này, bạn có thể chuyển hướng đầu ra sang /dev/null. Đây là một cái gì đó giống như một “lỗ đen”.

Dưới đây là ví dụ về cách ngăn chặn thông báo lỗi:

Ls -al badfile anotherfile 2> /dev/null
Cách tiếp cận tương tự được sử dụng nếu, chẳng hạn, bạn cần xóa một tệp mà không xóa nó:

Cat /dev/null > myfile

Kết quả

Hôm nay bạn đã tìm hiểu về cách hoạt động của đầu vào và đầu ra trong các tập lệnh dòng lệnh. Bây giờ bạn đã biết cách xử lý các bộ mô tả tệp, tạo, xem và đóng chúng cũng như biết về cách chuyển hướng các luồng đầu vào, đầu ra và lỗi. Tất cả điều này rất quan trọng trong việc phát triển các tập lệnh bash.

Lần tới chúng ta sẽ nói về các tín hiệu Linux, cách xử lý chúng trong các tập lệnh, chạy các công việc đã lên lịch và các tác vụ nền.

Gởi bạn đọc! Tài liệu này cung cấp những kiến ​​thức cơ bản về cách làm việc với các luồng đầu vào, đầu ra và lỗi. Chúng tôi chắc chắn rằng trong số các bạn có những chuyên gia có thể cho bạn biết về tất cả những điều này chỉ khi có kinh nghiệm. Nếu vậy, chúng tôi sẽ chuyển sàn cho bạn.