Chuyển hướng các luồng I/O c. Ví dụ về chuyển hướng I/O. Đóng các thẻ xử lý tập tin

Nếu đầu ra của bảng điều khiển (đồ họa) không nhiều, bạn có thể chỉ cần chọn một phần bằng chuột và chèn nó vào tin nhắn bằng cách nhấp vào nút giữa. Nếu không, bạn có thể sử dụng chuyển hướng đầu ra sang tệp qua kênh, như sau:

Tham số Some_command > logfile.txt

Để xem kết quả thực thi trên màn hình và đồng thời ghi vào file, bạn có thể sử dụng lệnh tee:

Tham số Some_command | tee -a logfile.txt

Lệnh setterm -dump tạo ảnh chụp nhanh của bộ đệm bảng điều khiển ảo hiện tại dưới dạng một tệp văn bản đơn giản với tên mặc định screen.dump. Là đối số của nó, bạn có thể sử dụng số lượng bảng điều khiển mà bạn muốn kết xuất. Và việc thêm tùy chọn tên tệp -file sẽ chuyển hướng kết xuất này sang một tệp có tên được chỉ định. Tùy chọn -append sẽ nối một kết xuất mới vào một tệp đã có sẵn - screen.dump "mặc định" hoặc được đặt tên bằng tùy chọn -file.

Những thứ kia. sau khi sử dụng lệnh như

Setterm -dump -file /root/screenlog

tương ứng trong tập tin /root/nhật ký màn hình sẽ là nội dung của một trang bảng điều khiển.

Tôi đã tìm thấy một giải pháp khác để sao chép/dán văn bản trong bảng điều khiển văn bản mà không cần chuột. Bạn cũng có thể sao chép văn bản từ bộ đệm cuộn (tức là mọi thứ trên màn hình và phía trên màn hình). Để hiểu rõ hơn, hãy đọc về người quản lý bảng điều khiển màn hình cửa sổ. Việc tăng kích thước bộ đệm cuộn cũng có thể hữu ích.

1) Màn hình khởi chạy

2) Nhấn Enter. Tất cả. Chúng tôi đang ở trong cửa sổ giao diện điều khiển số 0.

3) Thực hiện các lệnh cần thiết, đầu ra của lệnh này phải được sao chép.

4) Ctrl+A, Ctrl+[ - chúng tôi đang ở chế độ sao chép. Đặt con trỏ vào đầu vùng chọn, nhấn Phím cách, sau đó đặt con trỏ ở cuối vùng chọn, nhấn Phím cách. Văn bản đã được sao chép vào clipboard.

5) Ctrl+A, c - chúng tôi đã tạo cửa sổ đầu tiên mới.

6) Ctrl+A, 1 - chúng tôi đã đi đến cửa sổ đầu tiên.

7) Mở bất kỳ (?) soạn thảo văn bản(Tôi đã thử nó trong mc) và nhấn Ctrl+A, Ctrl+] - văn bản được chèn. Cứu.

8) Ctrl+A, Ctrl+0 - quay lại cửa sổ số 0.

Làm cách nào để tăng bộ đệm cuộn lại?

Giải pháp đầu tiên là tăng kích thước bộ đệm mặc định trong nguồn kernel và biên dịch lại nó. Hãy để tôi giả sử rằng bạn cũng phản đối điều này như tôi và đang tìm kiếm một giải pháp linh hoạt hơn.

Và có một công cụ như vậy, nó được gọi là framebuffer console, gọi tắt là fbcon. Thiết bị này có một tập tin tài liệu fbcon.txt; nếu bạn đã cài đặt tài liệu kernel thì bạn đã có nó. Hãy tìm anh ta ở đâu đó trong khu vực /usr/chia sẻ các nhánh (Tôi không thể chỉ định đường dẫn chính xác do sự khác biệt trong phân phối).

Tại thời điểm này, tôi xin lỗi: chúng ta phải lạc đề một chút và nói một chút về bộ đệm video ( khung đệm ).

Bộ đệm video là bộ đệm giữa màn hình và bộ điều hợp video. Cái hay của nó là nó có thể được điều khiển: nó cho phép các thủ thuật sẽ không hoạt động nếu bộ chuyển đổi được kết nối trực tiếp với màn hình.

Một thủ thuật như vậy liên quan đến bộ đệm cuộn; hóa ra bạn có thể "yêu cầu" bộ đệm video phân bổ thêm bộ nhớ bộ đệm cuộn. Điều này đạt được thông qua các tham số khởi động kernel. Đầu tiên bạn yêu cầu khung đệm(bộ đệm video); Sau đó, bạn yêu cầu bộ đệm cuộn lớn hơn.

Ví dụ sau đây dành cho GRUB, nhưng có thể dễ dàng điều chỉnh cho LILO. Trong tập tin cài đặt GRUB - menu.lst- tìm dòng tương ứng với kernel, sau đó: Xóa tùy chọn vga=xxx, nếu có. Thêm tùy chọn video=vesabf hoặc bất kỳ tùy chọn nào phù hợp với phần cứng của bạn. Thêm tùy chọn fbcon=scrollback:128. Sau quy trình này, dòng tham số kernel sẽ trông giống như thế này:

Hạt nhân /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128

Câu hỏi đặt ra là tại sao lại loại bỏ tùy chọn vga=xxx? Bởi vì xung đột có thể xảy ra với tùy chọn video. Trên bộ điều hợp ATI của tôi, tôi không thể thay đổi bộ đệm cuộn nếu vga=xxx có trong danh sách. Đây có thể không phải là trường hợp trong trường hợp của bạn. Nếu các tùy chọn trên hoạt động thì tốt; nhưng nếu bạn muốn tăng số dòng hoặc đặt phông chữ nhỏ hơn trên màn hình thì sao? Bạn luôn thực hiện việc này bằng tùy chọn vga=xxx - và đó là điều đã biến mất. Đừng lo lắng - bạn có thể đạt được điều tương tự bằng cách thay đổi các tham số fbcon như được mô tả trong tệp fbcon.txt(nhưng không được mô tả trong bài viết này).

Với tùy chọn fbcon=scrollback:128, bộ đệm cuộn của tôi tăng lên 17 màn hình (35 lần Shift+PgUp trên nửa màn hình). Nhân tiện, 128 là một kilobyte. Tác giả bài viết khẳng định không thể thiết lập thêm. Tôi chưa thử nó.

Bạn có thể sử dụng tập lệnh.

Tên tập lệnh.log

khi tất cả các lệnh cần thiết được hoàn thành -

Mọi thứ đều được ghi lại trong filename.log

FreeBSD có một tiện ích đồng hồ tuyệt vời cho phép bạn giám sát các thiết bị đầu cuối, nhưng hóa ra, trong Linux, nó thực hiện các chức năng hoàn toàn khác =\ Nếu bạn google chủ đề này, bạn sẽ tìm thấy thứ gì đó...

Toán tử chuyển hướng lệnh được sử dụng để thay đổi vị trí mặc định của luồng đầu vào và đầu ra lệnh sang một số vị trí khác. Vị trí của luồng đầu vào và đầu ra được gọi là tay cầm.

Bảng sau mô tả các toán tử chuyển hướng đầu vào và đầu ra lệnh.

Toán tử chuyển hướngSự miêu tả
> Thay vào đó, ghi dữ liệu vào đầu ra lệnh dòng lệnh tới một tập tin hoặc tới một thiết bị, chẳng hạn như máy in.
< Đọc luồng đầu vào lệnh từ một tập tin chứ không phải từ bàn phím.
>> Nối đầu ra lệnh vào cuối tệp mà không xóa thông tin hiện có khỏi tệp.
>& Đọc đầu ra của một bộ mô tả làm đầu vào cho một bộ mô tả khác.
<& Đọc đầu vào của một bộ điều khiển dưới dạng đầu ra của bộ điều khiển khác.
| Đọc đầu ra của một lệnh và ghi nó vào đầu vào của lệnh khác. Thủ tục này được gọi là phân kênh.

Theo mặc định, đầu vào lệnh (bộ xử lý STDIN) được gửi từ bàn phím đến trình thông dịch lệnh Cmd.exe, sau đó Cmd.exe sẽ gửi đầu ra lệnh (bộ xử lý STDOUT) đến cửa sổ nhắc lệnh.

Bảng sau đây hiển thị các mô tả có sẵn.

Các số từ 0 đến 9 đại diện cho 10 ký hiệu đầu tiên. Trình thông dịch lệnh Cmd.exe được sử dụng để chạy chương trình và chuyển hướng bất kỳ trong số 10 thẻ điều khiển. Để chỉ định điều khiển cần thiết, hãy nhập số của nó trước toán tử chuyển hướng. Nếu phần điều khiển không được xác định thì theo mặc định, toán tử chuyển hướng đầu vào "<» будет ноль (0), а оператором перенаправления вывода «>" sẽ là một (1). Sau khi nhập toán tử "<» или «>“Cần chỉ rõ nơi đọc và nơi ghi dữ liệu. Bạn có thể chỉ định tên tệp hoặc bất kỳ bộ mô tả hiện có nào.

Để chỉ định chuyển hướng đến các thẻ điều khiển hiện có, hãy sử dụng ký hiệu (&) theo sau là số của thẻ điều khiển mong muốn (ví dụ: & số xử lý). Ví dụ: để chuyển hướng bộ xử lý 2 (STDERR) sang bộ xử lý 1 (STDOUT), hãy nhập:

Bộ mô tả trùng lặp

Toán tử chuyển hướng "&" sao chép đầu ra hoặc đầu vào từ một bộ điều khiển được chỉ định này sang một bộ điều khiển được chỉ định khác. Ví dụ: để gửi đầu ra của lệnh dir tới File.txt và gửi đầu ra lỗi tới File.txt, hãy nhập:

thư mục>c:\file.txt 2>&1

Khi sao chép một bộ mô tả, tất cả các đặc điểm ban đầu của nó sẽ được sao chép. Ví dụ: nếu một điều khiển ở chế độ chỉ ghi thì tất cả các bản sao của nó sẽ ở chế độ chỉ ghi. Bạn không thể sao chép một thẻ điều khiển chỉ đọc thành một thẻ điều khiển chỉ ghi.

Chuyển hướng đầu vào lệnh (<)

Để chuyển hướng đầu vào bàn phím số sang một tập tin hoặc thiết bị, hãy sử dụng "<». Например, для ввода команды sort из файла List.txt введите:

loại

Nội dung của File.txt sẽ xuất hiện trên dòng lệnh dưới dạng danh sách theo thứ tự bảng chữ cái.

Nhà điều hành "<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

Ghi chú

  • Xử lý 0 là mặc định cho toán tử chuyển hướng đầu vào "<».

Chuyển hướng đầu ra lệnh (>)

Đầu ra của hầu hết tất cả các lệnh được hiển thị trong cửa sổ nhắc lệnh. Ngay cả các lệnh xuất dữ liệu ra đĩa hoặc máy in cũng tạo ra các thông báo và lời nhắc trong cửa sổ Dấu nhắc Lệnh.

Để chuyển hướng đầu ra của lệnh từ cửa sổ Dấu nhắc Lệnh sang một tệp hoặc thiết bị, hãy sử dụng toán tử ">". Toán tử này được sử dụng với hầu hết các lệnh. Ví dụ: để chuyển hướng đầu ra của lệnh dir sang tệp Dirlist.txt, hãy nhập:

thư mục>dirlist.txt

Nếu tệp Dirlist.txt không tồn tại, trình thông dịch lệnh Cmd.exe sẽ tạo nó. Nếu file tồn tại, Cmd.exe sẽ thay thế thông tin trong file bằng dữ liệu nhận được từ lệnh thư mục.

Để chạy lệnh kết xuất định tuyến Netsh rồi gửi kết quả làm việc của nó tới Route.cfg, nhập:

kết xuất định tuyến Netsh > c:\route.cfg

Toán tử ">" mở tệp được chỉ định với quyền truy cập chỉ ghi. Do đó, không thể đọc được tệp bằng toán tử này. Ví dụ: khi chạy một chương trình có toán tử chuyển hướng<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

Ghi chú.

  • Tay cầm 1 là mặc định cho toán tử chuyển hướng đầu ra ">".

Sử dụng toán tử "<&» для перенаправления ввода и дублирования

Để sử dụng toán tử chuyển hướng đầu vào, tệp được chỉ định phải tồn tại. Nếu tệp đầu vào tồn tại, trình thông dịch lệnh Cmd.exe sẽ mở tệp đó với quyền truy cập chỉ đọc và gửi nội dung của nó tới lệnh như thể đó là đầu vào bàn phím số. Khi một bộ điều khiển được chỉ định, trình thông dịch lệnh Cmd.exe sẽ sao chép nó thành một bộ điều khiển tồn tại trên hệ thống.

Ví dụ: để đọc File.txt vào bộ mô tả đầu vào 0 (STDIN), hãy nhập:

Để mở tệp File.txt, hãy sắp xếp nội dung của tệp rồi gửi tệp đến cửa sổ nhắc lệnh (STDOUT), hãy nhập:

loại< file.txt

Để tìm File.txt và chuyển hướng xử lý 1 (STDOUT) và xử lý 2 (STDERR) sang Search.txt, hãy nhập:

tìm tập tin file.txt>search.txt 2<&1

Để sao chép bộ mô tả 3 do người dùng xác định làm đầu vào cho bộ mô tả 0 (STDIN), hãy nhập:

Sử dụng toán tử ">&" để chuyển hướng đầu vào và sao chép

Khi bạn chuyển hướng đầu ra sang một tệp và chỉ định tên tệp hiện có, trình thông dịch lệnh Cmd.exe sẽ mở tệp với quyền truy cập chỉ ghi và ghi đè nội dung của nó. Nếu một bộ điều khiển được chỉ định, trình thông dịch lệnh Cmd.exe sẽ sao chép tệp vào bộ điều khiển hiện có.

Để sao chép bộ mô tả 3 do người dùng xác định thành bộ mô tả 1, hãy nhập:


Để chuyển hướng tất cả đầu ra, bao gồm đầu ra mô tả 2 (STDERR), các lệnh ipconfig vào phần xử lý 1 (STDOUT) rồi chuyển hướng đầu ra sang Output.log, nhập:


ipconfig.exe>>output.log 2>&1

Sử dụng toán tử ">>" để nối đầu ra

Để nối đầu ra của lệnh vào cuối tệp mà không làm mất thông tin được lưu trong đó, hãy sử dụng ký tự lớn hơn gấp đôi (>>). Ví dụ: lệnh sau thêm danh sách thư mục được tạo bởi lệnh thư mục, vào tệp Dirlist.txt:


thư mục>>dirlist.txt

Để thêm đầu ra lệnh netstatở cuối file Tcpinfo.txt nhập:


netstat>>tcpinfo.txt

Đôi khi sẽ thuận tiện hơn khi viết nó như thế này:

SET OutFile="%~n0.html" > %OutFile% ECHO ^ >> %OutFile% ECHO ^ >> %OutFile% ECHO ^ trang hay nhất^>> %OutFile% ECHO ^>> %OutFile% ECHO ^ >> %OutFile% ECHO Xin chào thế giới >> %OutFile% ECHO ^>> %OutFile% ECHO ^

Sử dụng toán tử kênh (|)

Nhà điều hành kênh " đường thẳng đứng" (|) nhận đầu ra của một lệnh (STDOUT mặc định) và gửi nó đến đầu vào của lệnh khác (STDIN mặc định). Ví dụ: lệnh sau sắp xếp một thư mục:

Trong ví dụ này, cả hai lệnh đều được chạy đồng thời, nhưng lệnh loại tạm dừng cho đến khi nhận được đầu ra lệnh thư mục. Đội loại sử dụng đầu ra lệnh thư mục làm đầu vào và sau đó gửi đầu ra tới bộ mô tả 1 (STDOUT).

Kết hợp các lệnh với toán tử chuyển hướng

Bằng cách kết hợp các lệnh lọc với các lệnh và tên tệp khác, bạn có thể tạo các lệnh tùy chỉnh. Ví dụ: để lưu tên tệp chứa chuỗi "LOG", hãy sử dụng lệnh sau:

thư mục /b | tìm "LOG"> loglist.txt

Đầu ra lệnh thư mục gửi đến lệnh lọc tìm thấy. Tên tệp chứa chuỗi "LOG" được lưu trữ trong tệp Loglist.txt dưới dạng danh sách (ví dụ: NetshConfig.log, Logdat.svd và Mylog.bat).

Khi sử dụng nhiều bộ lọc trong một lệnh, chúng phải được phân tách bằng dấu gạch đứng (|). Ví dụ: lệnh sau sẽ tìm kiếm từng thư mục trên ổ C để tìm các tệp có chuỗi “Nhật ký” trong tên của chúng và hiển thị chúng theo từng trang:

thư mục c:\ /s /b | tìm "ĐĂNG NHẬP" | hơn

Sự hiện diện của một đường ống (|) cho cmd.exe biết rằng đầu ra của lệnh DIR sẽ được gửi đến lệnh bộ lọc tìm thấy. Lệnh find chỉ chọn những tên tệp có chứa chuỗi "LOG". Lệnh more hiển thị tên file thu được bằng lệnh tìm thấy với một khoảng dừng sau khi mỗi màn hình được lấp đầy. thông tin thêm về các lệnh lọc, xem phần

Ba hướng I/O được dành riêng - đầu vào, đầu ra và luồng lỗi tiêu chuẩn ( stdin, thiết bị xuất chuẩn, thiết bị xuất chuẩn ). Theo mặc định, cả ba luồng đều được liên kết với thiết bị đầu cuối. Trong trường hợp này, chương trình sẽ hiển thị tất cả các thông báo của nó, bao gồm cả lỗi, tới thiết bị đầu cuối. Vỏ bọc cho phép bạn chuyển hướng các luồng tiêu chuẩn này, đặt I/O và gộp luồng.

Chuyển hướng luồng I/O.

> tập tin Chuyển hướng đầu ra tiêu chuẩn sang một tập tin tài liệu

>>tập tin -Chuyển hướng đầu ra tiêu chuẩn sang tập tin tài liệu bằng cách thêm vào cuối tập tin.

-nhận đầu vào tiêu chuẩn từ một tập tin tài liệu.

prog1 | prog2 -Chuyển luồng đầu ra của chương trình prog1 sang luồng đầu vào của chương trình prog2.

n>tập tin tài liệu.

n>> tập tin -Chuyển hướng luồng tiêu chuẩn với bộ mô tả n sang tệp tài liệu bằng cách thêm vào cuối tập tin.

n>&m -Kết hợp các chủ đề với tay cầm N tôi .

$ prog1 >/dev/null 2>&1

/dev/null là một thiết bị giả có tác dụng phá hủy dòng chảy hướng vào nó.

Việc chuyển luồng đầu ra của một chương trình sang luồng đầu vào của chương trình khác thường được sử dụng. Ví dụ:

$ gzip -d archive.tar.gz | tar –xf

Đây là nơi tập tin được giải nén archive.tar.gz , được đóng gói bởi hai nhà lưu trữ. Luồng đầu ra từ tiện ích gzip được chuyển đến luồng đầu vào của tiện ích hắc ín . Tương tự, thao tác tương tự có thể được thực hiện theo cách khác:

$ gzip -d archive.tar.gz

$ tar -xf archive.tar

Bởi vì ngôn ngữ Vỏ Bourne là một ngôn ngữ lập trình thủ tục, trong đó cũng giống như các ngôn ngữ khác ngôn ngữ tương tự Có những toán tử cho phép bạn kiểm soát trình tự thực hiện lệnh. Một toán tử cần thiết là kiểm tra một điều kiện nhất định, tùy thuộc vào việc thực hiện điều kiện đó mà quá trình tiếp theo của chương trình được xác định. Toán tử như vậy là lệnh Bài kiểm tra. Lệnh này kiểm tra xem một số điều kiện có được đáp ứng hay không. Đội Bài kiểm tra Có hai lựa chọn cuộc gọi:

điều kiện kiểm tra

[ tình trạng ]

Cần lưu ý rằng phải có khoảng cách giữa dấu ngoặc và điều kiện, nếu không Vỏ bọc sẽ không nhận ra "[" là một lệnh Bài kiểm tra . Khi hoàn thành thành công Bài kiểm tra trả lại "0" .

Điều kiện kiểm tra hồ sơ:

-f tập tin Tài liệu "tài liệu" là một tập tin thông thường.

tập tin -d Tài liệu " tài liệu" là một thư mục.
-c tập tin Tài liệu "tài liệu" là một tập tin đặc biệt.
-r tập tin Tài liệu "tài liệu" đã có quyền đọc.

-w tập tin Tài liệu "tài liệu" có quyền viết.

tập tin -x Tài liệu "tài liệu" có quyền biểu diễn.

-s tập tin Tài liệu "tài liệu" không trống rỗng.

Điều kiện kiểm tra chuỗi:

chuỗi1=chuỗi2 Dây chuỗi1 chuỗi2 phù hợp.

chuỗi1!=chuỗi2 Dây chuỗi1 chuỗi2 không khớp.

-n chuỗi1 Đường kẻ chuỗi1 tồn tại.

-z chuỗi1 Đường kẻ chuỗi1 không tồn tại.

Điều kiện thực hiện các phép tính với số nguyên:

x -eq y x bằng y

x -ne y x không bằng y

x -gt y x lớn hơn y

x -ge y x lớn hơn hoặc bằng y

x -lt y x nhỏ hơn y

x -le y x nhỏ hơn hoặc bằng y

Trong trường hợp này lệnh Bài kiểm tra xử lý chuỗi chính xác như số nguyên. Giá trị 0 một chuỗi trống cũng khớp.

Các phép toán logic trong ngữ cảnh Bài kiểm tra

! (không) Hợp lý "KHÔNG"

-o (hoặc) Hợp lý "HOẶC"

-a (và) Hợp lý "VÀ"

Điều hành có điều kiện "nếu như"

Hình thức chung Việc sử dụng câu lệnh if có điều kiện được biểu diễn như sau:

nếu như<условие>

sau đó<список команд>

[elif<условие>

sau đó<список> ]

Biểu thức trong ngoặc vuông là tùy chọn. Những thứ kia. chúng ta có thể tưởng tượng cách sửa đổi “cắt nhỏ” phổ biến nhất của toán tử điều kiện:

nếu như<условие>

sau đó<список команд>

Trong trường hợp này, nếu <условие> hoàn thành (mã thoát 0) rồi thực thi <список команд>. Nếu không thì <список команд> bỏ qua.

Toán tử lựa chọn trường hợp

TRONG trường hợp chung cú pháp toán tử trường hợp như sau:

trường hợp<строка>TRONG

Mẫu 1)

........

Mẫu2)

........

........

Nghĩa <строка> so sánh với mẫu, theo thứ tự. Nếu tìm thấy kết quả khớp thì các lệnh trong phần tương ứng sẽ được thực thi. Cần lưu ý rằng các mẫu cho phép sử dụng mặt nạ. Nếu không tìm thấy kết quả khớp thì các lệnh từ phần có mẫu "*" sẽ được thực thi (tương tự như mặc định bộ chọn công tắc V. VỚI ).

Ví dụ, đây là một đoạn script khởi tạo BSD UNIX . Dưới đây là các biến (inetd_enable và inetd_flags) được lấy từ một tập tin khác ( RC.conf).

. /etc/rc.conf

trường hợp ($inetd_enable) trong

)

if [ -x /usr/sbin/inetd ]; sau đó

/usr/sbin/inetd $inetd_flags

fi

;;

esac

Toán tử vòng lặp có liệt kê

Cú pháp toán tử

vì<имя>

<список команд>

Đoạn được đánh dấu trong ngoặc vuông có thể bị thiếu. Nhà điều hành đảm bảo rằng vòng lặp được thực thi nhiều lần bằng số từ trong danh sách giá trị. Trong trường hợp này, biến <имя> lấy tuần tự ý nghĩa của các từ trong danh sách. Bản thân danh sách có thể được hình thành từ đầu ra của các lệnh khác. Nếu danh sách bị thiếu thì <имя> chấp nhận các giá trị được truyền dưới dạng tham số vị trí cho tập lệnh.

Câu lệnh lặp với điều kiện đúng trong khi

Cú pháp toán tử trong khi nói chung nó có cấu trúc như sau:

trong khi<условие>

<список команд>

Nhà điều hành trong khi thích hợp hơn khi không biết trước danh sách các giá trị tham số. Danh sách các lệnh sẽ được thực thi trong một vòng lặp miễn là điều kiện vẫn đúng. Khi bạn vào vòng lặp lần đầu tiên, điều kiện phải đúng.

Câu lệnh lặp với điều kiện sai cho đến khi

Cú pháp toán tử cho đến khi nói chung nó có cấu trúc như sau:

cho đến khi<условие>

<список команд>

Danh sách các lệnh sẽ được thực thi trong một vòng lặp miễn là điều kiện vẫn sai. Lần đầu tiên bạn vào vòng lặp, điều kiện sẽ không đúng. Cần lưu ý rằng điều kiện vòng lặp được kiểm tra tính sai sau mỗi lần, bao gồm. và lệnh được thực hiện đầu tiên trong vòng lặp.

Các lệnh cơ bản Hệ điều hành UNIXđể làm việc với các tập tin

1. Đội pwd.

Cú pháp: pwd .

Mô tả: Lệnh hiển thị tên của thư mục hiện tại cho shell đang chạy.

Bài tập 1.

Sử dụng lệnh pwd để xác định thư mục chính của bạn.

Phản ánh nhóm và kết quả công việc của nhóm trong báo cáo.

2. Đội người đàn ông.

Cú pháp: người đàn ông Tên.

Tên là tên của lệnh, tiện ích, lời gọi hệ thống, hàm thư viện hoặc tệp mà chúng ta quan tâm.

Sự miêu tả : HƯỚNG DẪN UNIX - hướng dẫn sử dụng hệ điều hành UNIX. Thông tin từ đó có sẵn tương tác bằng cách sử dụng tiện ích người đàn ông .

Nhiệm vụ 2.

Sử dụng tiện ích man để tra cứu thông tin về lệnh pwd.

Viết thông tin ngắn gọn về đội trong báo cáo (bằng tiếng Nga).

3. Đội đĩa CD.

Cú pháp: đĩa CD Tên thư mục.

Mô tả: Đây là lệnh để thay đổi thư mục hiện tại. DirectoryName là tên đầy đủ hoặc tên tương đối của thư mục bạn muốn đặt thành hiện tại.

đĩa CD không có tham số, cái hiện tại sẽ tạo thư mục chính của bạn.

Nhiệm vụ 3.

Làm cho thư mục hiện tại cao hơn một cấp. Kiểm tra nó, sau đó quay trở lại thư mục chính của bạn. Kiểm tra sự thay đổi thư mục.

Việc thực hiện các lệnh đã hoàn thành sẽ được phản ánh trong báo cáo.

4. Đội ls.

Cú pháp: ls Tên thư mục

Mô tả: lệnh xem nội dung của thư mục được chỉ định.

ls không có tham số, in danh sách các tệp từ thư mục hiện tại.

Danh sách kết quả sẽ không bao gồm các tệp có tên bắt đầu bằng ký hiệu “ . ” - các tệp được tạo bởi các chương trình hệ thống khác nhau cho mục đích riêng của chúng. Nhìn danh sách đầy đủ tập tin có thể được chỉ định trong lệnh ls phím “-a”,

những thứ kia. ls -adirectory_name

Quyền tập tin

Với mỗi tập tin trong Hệ điều hành UNIX được liên kết với một từ 12 bit được gọi là "quyền" đối với tệp.

9 bit thấp hơn của từ này được kết hợp thành ba nhóm ba bit; Mỗi nhóm chỉ định quyền truy cập cho chủ sở hữu tệp, cho nhóm của anh ấy và cho tất cả những người dùng khác. Ba bit trong mỗi nhóm chịu trách nhiệm về quyền đọc, truy vấn và sử dụng tệp.

Để tìm hiểu quyền truy cập vào một tệp cụ thể, bạn có thể sử dụng lệnh

, Ví dụ:

> ls -l /bin/cat

Nhóm ký tự nằm ở đầu dòng -rwxr-xr-x hiển thị loại tệp (ký tự đầu tiên; dấu trừ có nghĩa là chúng ta đang xử lý một tệp thông thường, chữ cái d có nghĩa là một thư mục, v.v.) và quyền truy cập tương ứng cho chủ sở hữu (trong trong trường hợp này rwx , I E. đọc, viết và thực thi), nhóm và mọi người khác (trong trường hợp này r-x , I E. không có quyền viết). Vì vậy tập tin /bin/con mèo có thể được đọc và thực thi bởi bất kỳ người dùng nào, nhưng chỉ người dùng mới có thể sửa đổi nó nguồn gốc (tức là quản trị viên).

Bạn có thể viết từ quyền truy cập file dưới dạng số bát phân (3 ký tự - chữ số bát phân), ba chữ số (chủ sở hữu, nhóm, người dùng khác) mỗi ký tự trong số bát phân ba chữ số này được hình thành dưới dạng tổng các quyền: 4 - quyền đọc, 2 - quyền ghi, 1 - quyền sử dụng (từ bộ ba nhị phân): (111) 2 =2 0 +2 1 +2 2 =(1+2+4) 10 .

Ví dụ, 7 = 1 + 2 + 4 Þ đúng rwx

4 2 1

6 = 0 + 2+ 4 Þ phải rw- -

4 2 0

Trong một số có ba chữ số, chỉ định quyền: 744 Tất cả các quyền được xác định cho chủ sở hữu, chỉ đọc cho nhóm và chỉ đọc cho những người dùng khác.

Để sử dụng quyền truy cập tệp, hãy sử dụng lệnh chmod , cho phép bạn chỉ định các quyền mới dưới dạng số bát phân, ví dụ:

$ chmod 744 filel.c.

Nhiệm vụ 4.

a) Để nhận thông tin đầy đủ về lệnh ls, hãy sử dụng tiện ích man. Chuyển hướng đầu ra lệnh sang một cái gì đó tập tin văn bản.

b) Xem toàn bộ nội dung của thư mục hiện tại và chuyển hướng đầu ra này sang một tệp văn bản.

c) Sử dụng lệnh ls -l<имя_файла> In thông tin về quyền truy cập vào tệp văn bản mà bạn đã làm việc ở bước 4b, sau đó chuyển hướng thông tin này đến cùng một tệp văn bản. Giải thích kết luận của bạn.

5. Đội con mèo.

Chuyển hướng I/O.

Để xem nội dung của một file văn bản nhỏ trên màn hình, bạn có thể sử dụng lệnh:

con mèo tên tập tin

Chú ý!Đừng cố xem nội dung của thư mục và tệp nhị phân theo cách này.

Một nhóm có thể dễ dàng xem một tệp thử nghiệm lớn hơn (để biết mô tả sử dụng, xem HƯỚNG DẪN UNIX ). Tại sao lệnh lại bất tiện ở đây? con mèo ?

Trong một nhóm con mèo Bạn có thể chỉ định nhiều tên tệp:

tập tin mèo1 tập tin 2 ... tập tin N

trong trường hợp này, nội dung của tất cả các tệp liên tiếp sẽ được hiển thị trên màn hình.

Bạn có thể chuyển hướng đầu ra sang một tệp:

tập tin cat 1 tập tin 2 > results_file

Chuyển hướng đầu ra từ đầu ra tiêu chuẩn (màn hình) sang một tệp là tiêu chuẩn cho tất cả các lệnh. Bạn có thể chuyển hướng đầu vào tiêu chuẩn (từ bàn phím), ví dụ: lấy dữ liệu cho chương trình từ một tệp, sử dụng dấu “<”.

con mèo > new_file - sẽ tạo một tệp văn bản mới với nội dung bạn nhập từ bàn phím.

Hủy bỏ quá trình nhập dữ liệu -

Nhiệm vụ 5.

Tạo một tệp văn bản mới bằng cat và xem nội dung của nó. Chuyển hướng đầu ra từ luồng tiêu chuẩn sang tệp khác, tên mà bạn nhập từ bàn phím và xác minh rằng thao tác đã được thực hiện chính xác.

6. Các lệnh đơn giản nhất để làm việc với tập tin : cp, rm, mkdir, mv

Để tạo một thư mục mới sử dụng lệnh:

mkdir Tên thư mục

Để sao chép nội dung của tệp này sang tệp khác, hãy sử dụng lệnh:

cp file_source_file_destination.

Đội

tập tin cp 1 tập tin 2…. thư mục đích của tập tin N

dùng để sao chép một hoặc nhiều tập tin vào một thư mục đã tồn tại với tên Destination_directory dưới tên riêng của chúng. Thay vì tên của các tệp được sao chép, bạn có thể sử dụng mẫu của chúng. Các mẫu được chỉ định bằng cách sử dụng siêu ký tự:

* - khớp với tất cả các chuỗi ký tự, kể cả các chuỗi ký tự trống.

Tất cả các ký tự đơn

[…] - khớp với bất kỳ chữ cái nào được đặt trong ngoặc. Một cặp ký tự được phân tách bằng dấu trừ chỉ định một phạm vi ký tự.

Đội

cp-r dir_source dir_destination

phục vụ cho việc sao chép đệ quy một thư mục (source_dir) sang một thư mục mới (destination_dir).

Thay vì tên trong lệnh sao chép, bạn có thể sử dụng mẫu của chúng.

Đội

tập tin rm 1 tập tin 2…. tập tin N

cho phép bạn xóa 1 hoặc nhiều tệp thông thường khỏi thư mục hiện tại.

Ký tự đại diện có thể được sử dụng thay cho tên. Nếu bạn muốn xóa một hoặc nhiều thư mục cùng với nội dung của chúng (xóa đệ quy) trong lệnh rm sử dụng chìa khóa -r

Rm-r thư mục 1 thư mục 2

Lệnh đổi tên:

mv tên_nguồn_tên_đích

Tệp có tên source_name được đổi tên thành tệp có tên Destination_name. Trong trường hợp này, trước khi thực hiện lệnh, tệp có tên Destination_name không được tồn tại.

Nhiệm vụ 6.

Tạo một thư mục mới bên trong thư mục chính của bạn. Sắp xếp một tệp thử nghiệm nhỏ ở đó với hai dòng nội dung:

“Tôi đang học cách làm việc trên hệ điều hành UNIX

Tôi sẽ sắp xếp kịch bản.”

Sao chép nội dung của tệp này sang tệp khác có cùng tên, nhưng trong thư mục /home. Xóa tệp được tạo ban đầu khỏi thư mục của bạn nếu sao chép thành công. Kiểm tra nội dung của các thư mục và tập tin được sử dụng.

Nhiệm vụ 7.

1). Khi bạn đã thành thạo cách làm việc tương tác với các lệnh UNIX đơn giản nhất, hãy sử dụng trình soạn thảo Kwriter để tạo một tập lệnh có tập lệnh tương ứng với việc thực thi tuần tự:

Nhiệm vụ 3,

Nhiệm vụ 4B, 4B,

Nhiệm vụ 5,

Nhiệm vụ 6.

Trong nhiệm vụ 6, đừng quên lập trình kiểm tra xem việc sao chép tệp có thành công hay không, hiển thị tin nhắn và nội dung của các thư mục tương ứng.

Điều cần thiết là ở tập tin hàng loạt việc ban hành các yêu cầu nhập dữ liệu từ bàn phím có thẩm quyền được tổ chức bằng lệnh: $ echo - n “văn bản yêu cầu”.

2). Lưu tập lệnh với tên Myscript1, chạy nó bằng lệnh

sh Myscript1

Nhập dữ liệu được yêu cầu và kiểm tra kết quả.

3). Biên soạn một báo cáo về công việc trong phòng thí nghiệm đã hoàn thành, báo cáo này sẽ phản ánh cả công việc của bạn ở chế độ tương tác và với tập lệnh, bao gồm văn bản của tập lệnh (có nhận xét) và kết quả thu được trên màn hình và trong tệp.

Cuộc gọi hệ thống getuid và getpid

Tìm ra mã định danh của người dùng đã khởi chạy chương trình để thực thi - UID và ID của nhóm mà nó thuộc về ,-GID có thể sử dụng các cuộc gọi hệ thống getuid() và getpid() bằng cách áp dụng chúng trong chương trình này.

Nguyên mẫu cuộc gọi hệ thống:

#bao gồm

#bao gồm

uid_t getuid(void);

gid_t getgid(void);

Nhiệm vụ 8.

Viết, biên dịch và chạy chương trình in ID người dùng và ID nhóm của người dùng đang chạy chương trình.

Bao gồm chương trình với các kết quả trong báo cáo.

Câu hỏi kiểm soát

1. Khái niệm về tập tin trong Hệ điều hành UNIX . Chuyện gì đã xảy ra vậy thư mục chính?

2. Có những phương tiện nào để nhóm lệnh? Vỏ bọc -thông dịch viên? cung cấp các ví dụ về việc sử dụng

3. I/O được chuyển hướng như thế nào?

4. Đường dẫn lệnh là gì? cho một ví dụ.

5. Bằng cách này Vỏ bọc thực hiện các phép tính trên Vỏ bọc -Biến đổi?

6. Quy tắc tạo tên file là gì?

7. Việc thay thế lệnh được thực hiện như thế nào?

8. Cách diễn giải một chuỗi cmd1&cmd2& ?

9. Cách diễn giải một chuỗi cmd1 && cmd2 & ?

10. Cách diễn giải một chuỗi cmd1 || cmd2& ?

11. Như trong UNIX Quyền của tập tin có được xác định không? Lệnh nào bạn có thể xem chúng? tập tin cụ thể?

12. Làm cách nào để xác định danh tính của người dùng đã khởi chạy chương trình và mã định danh nhóm của người đó?

Công việc trong phòng thí nghiệm № 3.

Các tiến trình trong hệ điều hành UNIX.

Mục tiêu của công việc

Tìm hiểu cách tạo quy trình và nắm vững việc thay đổi bối cảnh người dùng của quy trình bằng cách sử dụng lệnh gọi hệ thống được sử dụng trong các chương trình bằng ngôn ngữ VỚI, V Hệ điều hành UNIX.

1. Nghiên cứu tổ chức các quy trình trong UNIX : khái niệm về quy trình, bối cảnh quy trình, vòng đời quy trình, nhận dạng quy trình, cấu trúc phân cấp của quy trình. Viết thư cho VỚI và gỡ lỗi chương trình theo task 1.

2. Làm quen với việc tạo một quy trình trong UNIX , với việc tổ chức hoàn thành quá trình. Viết và gỡ lỗi một chương trình (ngôn ngữ VỚI ) theo Bài tập 2, đưa vào báo cáo.

3. Khám phá các thông số chức năng chủ yếu() bằng ngôn ngữ VỚI , biến môi trường và đối số dòng lệnh. Viết chương trình bằng ngôn ngữ VỚI theo Nhiệm vụ 3, gỡ lỗi và đưa vào báo cáo cùng với kết quả.

4. Khám phá nhóm chức năng để tổ chức cuộc gọi hệ thống thực thi().

5. Viết chương trình bằng ngôn ngữ VỚI theo mẫu bài 4 do giáo viên đưa ra, debug chương trình và trình bày kết quả thu được cho giáo viên. Bao gồm chương trình với các kết quả trong báo cáo.

6. Bảo vệ bài trước giáo viên bằng cách trả lời các câu hỏi kiểm tra.

Bất kỳ chương trình nào cũng là một “máy tự động” được thiết kế để xử lý dữ liệu: nhận một thông tin làm đầu vào, nó sẽ tạo ra một thông tin khác do công việc của nó. Mặc dù thông tin đến và/hoặc đi có thể bằng 0, nghĩa là đơn giản là không có. Dữ liệu được chuyển đến chương trình để xử lý là đầu vào của nó, những gì nó tạo ra sau công việc là đầu ra. Tổ chức đầu vào và đầu ra cho mỗi chương trình là nhiệm vụ của hệ điều hành.

Mỗi chương trình hoạt động với dữ liệu thuộc một loại nhất định: văn bản, đồ họa, âm thanh, v.v. Có lẽ đã rõ, giao diện quản lý hệ thống chính trong Linux là một thiết bị đầu cuối, được thiết kế để truyền thông tin văn bản từ người dùng đến hệ thống và mặt sau. Vì đầu vào từ thiết bị đầu cuối và đầu ra đến thiết bị đầu cuối chỉ có thể được thông tin văn bản, thì đầu vào và đầu ra của các chương trình liên kết với thiết bị đầu cuối cũng phải là văn bản. Tuy nhiên, nhu cầu thao tác với dữ liệu văn bản không hạn chế khả năng quản lý hệ thống mà trái lại, còn mở rộng chúng. Một người có thể đọc đầu ra của bất kỳ chương trình nào và hiểu điều gì đang xảy ra trong hệ thống, đồng thời các chương trình khác nhau hóa ra lại tương thích với nhau vì chúng sử dụng cùng một kiểu biểu diễn dữ liệu - văn bản.

Các lệnh và tập lệnh có thể nhận đầu vào theo hai cách: từ đầu vào tiêu chuẩn (được liên kết với bàn phím) hoặc từ một tệp. Có sự phân tách tương tự đối với đầu ra: đầu ra của lệnh hoặc tập lệnh được gửi đến màn hình đầu cuối theo mặc định, nhưng bạn có thể chuyển hướng nó đến một tệp. Nếu xảy ra lỗi trong quá trình hoạt động. thông báo về chúng cũng được hiển thị trên màn hình và dòng lỗi cũng có thể được chuyển hướng đến một tệp.

Trước tiên chúng ta hãy xem xét một số lệnh có thể được sử dụng để tổ chức I/O.

Lệnh xuất ra thiết bị đầu ra tiêu chuẩn

Linux cung cấp một số lệnh để in thông báo ra đầu ra tiêu chuẩn:

  • echo - In một chuỗi ra đầu ra tiêu chuẩn.
  • printf - In văn bản được định dạng thành đầu ra tiêu chuẩn.
  • có - In văn bản lặp lại thành đầu ra tiêu chuẩn.
  • seq - In một dãy số ra đầu ra tiêu chuẩn
  • rõ ràng Xóa màn hình hoặc cửa sổ.

Ví dụ: khi sử dụng lệnh echo, nếu bạn chỉ định ký tự điều khiển \c thì khi xuất xong, nó sẽ không chuyển sang dòng mới:

$ echo "Tên bạn là gì?\c"

Tên bạn là gì?$

Ở đây $ là biểu tượng lời mời.

Dòng này cũng có thể tính toán giá trị của các biến shell và thậm chí cả các lệnh khác. Ví dụ: lệnh sau cho bạn biết thư mục bắt đầu là gì người dùng hiện tại (biến môi trường$HOME) và nó được kết nối với thiết bị đầu cuối nào (lệnh tty được đặt trong dấu ngoặc kép để trình thông dịch sẽ đưa kết quả thực thi của nó lên dòng).

$ echo "Thư mục chính của bạn là $HOME, bạn đã kết nối với terminal - `tty` "

Thư mục chính của bạn là/home/knoppix, bạn được kết nối với thiết bị đầu cuối - /dev/tty1

Bởi vì dấu ngoặc kép trong trình thông dịch shell họ có cuộc hẹn đặc biệt, thì để bao gồm dấu ngoặc kép trong chuỗi đầu ra, bạn cần hoàn tác mục đích đặc biệt của chúng bằng cách sử dụng dấu gạch chéo ngược (\). Điều này hủy bỏ việc gán bất kỳ ký tự đặc biệt nào.

Ví dụ: để hiển thị chuỗi “/dev/tty1” bạn cần chạy:

$echo “\”/dev/tty1\””

Nhập lệnh từ thiết bị tiêu chuẩnđầu vào

Lệnh đọc đọc một dòng từ đầu vào tiêu chuẩn và ghi nội dung của nó vào các biến được chỉ định. Khi chỉ định một số biến, từ đầu tiên được ghi vào biến đầu tiên, từ thứ hai vào biến thứ hai, v.v. cái cuối cùng chứa phần còn lại của dòng.

Đoạn script sau gọi một lệnh đọc riêng để đọc từng biến.


bài kiểm tra mèo $
#!/bin/bash
echo “Tên: \c”
đọc tên
echo “Họ: \c”
đọc họ
echo “Tên=” $name “Họ=” $họ

Sau đó, để thực thi tập lệnh này, bạn cần cấp quyền thực thi cho tệp kiểm tra: chmod 0755 test và chạy nó./test. Kết quả thực hiện: Tên: Ivan Họ: Petrov Tên=Ivan Họ=Petrov

DÒNG ĐẦU VÀO, ĐẦU RA VÀ LỖI TIÊU CHUẨN

Mỗi chương trình được khởi chạy từ trình thông dịch lệnh sẽ nhận được ba luồng I/O mở:

Đầu vào tiêu chuẩn (sldin) - đầu ra tiêu chuẩn (sldout) - đầu ra lỗi tiêu chuẩn (stderr)

Theo mặc định, các luồng này được liên kết với thiết bị đầu cuối. Những thứ kia. Bất kỳ chương trình nào không sử dụng luồng khác với luồng tiêu chuẩn sẽ chờ đầu vào từ bàn phím đầu cuối; tất cả đầu ra của chương trình đó, bao gồm cả thông báo lỗi, sẽ xuất hiện trên màn hình đầu cuối.

Hơn nữa, mỗi tiến trình (lệnh, tập lệnh, v.v.) được thực thi trong trình thông dịch shell có một số liên kết mở tập tin, từ đó một tiến trình có thể đọc dữ liệu của nó: và nó có thể ghi dữ liệu đó vào đó. Mỗi tập tin này được xác định bởi một số gọi là mô tả tập tin, nhưng ba tệp đầu tiên là luồng I/O mặc định:

Bộ mô tả tập tin
Luồng đầu vào tiêu chuẩn 0
Đầu ra tiêu chuẩn 1
Luồng lỗi tiêu chuẩn 2

Trên thực tế, 12 tệp đang mở được tạo nhưng các tệp có ký hiệu mô tả 0, 1 và 2 được dành riêng cho đầu vào, đầu ra và lỗi tiêu chuẩn. Người dùng cũng có thể làm việc với các tệp có bộ mô tả tệp từ 3 đến 9 (dành riêng).

Tệp đầu vào tiêu chuẩn (sldin) có số xử lý là 0. Từ tệp này, các quy trình sẽ trích xuất dữ liệu đầu vào của chúng. Theo mặc định, luồng đầu vào được liên kết với bàn phím (thiết bị /dev/tty), nhưng hầu hết nó thường đi qua một đường dẫn từ các tiến trình khác hoặc từ một tệp thông thường.

Tệp đầu ra tiêu chuẩn (thiết bị xuất chuẩn) có số xử lý 1. Tất cả đầu ra từ quá trình được ghi vào tệp này. Theo mặc định, dữ liệu được xuất ra màn hình đầu cuối (thiết bị/dev/tty), nhưng nó cũng có thể được chuyển hướng đến một tệp hoặc được chuyển sang một quy trình khác.

Tệp luồng lỗi tiêu chuẩn (siderr) có bộ mô tả 2. Các thông báo lỗi xảy ra trong quá trình thực thi lệnh được ghi vào tệp này. Theo mặc định, thông báo lỗi được xuất ra màn hình đầu cuối (thiết bị/dev/tty), nhưng chúng cũng có thể được chuyển hướng đến một tệp. Tại sao phân bổ ghi nhật ký lỗi? tập tin đặc biệt? Thực tế đây là một cách rất thuận tiện để trích xuất dữ liệu đầu ra thực tế từ kết quả của lệnh, cũng như cơ hội tốt tổ chức có hiệu quả việc bảo quản các loại hồ sơ tạp chí.

Một số lượng lớn các tiện ích chỉ sử dụng các luồng tiêu chuẩn. Đối với những chương trình như vậy, shell cho phép các luồng I/O được chuyển hướng độc lập. Ví dụ: bạn có thể chặn các thông báo lỗi, đặt đầu vào hoặc đầu ra từ một tệp.

Những thứ kia. Khi gọi lệnh, bạn có thể chỉ định nơi nhận đầu vào và nơi gửi đầu ra cũng như các thông báo lỗi. Theo mặc định, trừ khi có quy định khác, giả định làm việc với thiết bị đầu cuối: dữ liệu được nhập từ bàn phím và hiển thị trên màn hình. Nhưng trình thông dịch shell có cơ chế chuyển hướng cho phép các luồng tiêu chuẩn được liên kết với tập tin khác nhau. Trong trường hợp này, khi chuyển hướng luồng lỗi tiêu chuẩn, phải chỉ định bộ mô tả tệp (2). Điều này không cần thiết đối với luồng đầu vào và đầu ra.

Hữu ích trương hợp đặc biệt sử dụng cơ chế chuyển hướng luồng - chuyển hướng đến /dev/null, cho phép bạn loại bỏ các thông báo không cần thiết trên màn hình. Sử dụng cơ chế tương tự, bạn có thể tạo các tệp trống:

% cat myfile - sẽ tạo trong thư mục hiện tại tệp tin rỗng tập tin của tôi.

/dev/null là một tệp đặc biệt được gọi là. " thiết bị trống" Việc ghi vào nó diễn ra thành công, bất kể lượng thông tin “được ghi lại”. Đọc từ /dev/null tương đương với việc đọc phần cuối của tệp EOF.

Chuyển hướng luồng I/Ođược thực hiện, giống như DOS (Chính xác hơn là hệ điều hành DOS sử dụng cú pháp chuyển hướng các luồng từ UNIX) bằng cách sử dụng các ký hiệu:

- chuyển hướng luồng đầu ra tiêu chuẩn
- chuyển hướng luồng đầu ra tiêu chuẩn ở chế độ chắp thêm
- chuyển hướng luồng đầu vào tiêu chuẩn
- nhận dữ liệu từ đầu vào tiêu chuẩn cho đến khi gặp dấu phân cách

Tuy nhiên, không giống như DOS, khi tạo kênh chương trình giữa hai tiến trình, hệ điều hành UNIX/Linux khởi chạy đồng thời cả hai tiến trình và truyền thông tin qua bộ đệm hệ thống (không ghi trung gian vào đĩa cứng). Như vậy, kênh chương trình trong hệ điều hành UNIX/Linux rất cách hiệu quả trao đổi. Trường hợp tràn bộ đệm hệ thống(ví dụ: nếu chương trình `` gửi '' xuất thông tin đến kênh nhanh hơn chương trình `` nhận '' có thể xử lý nó) thì hệ điều hành sẽ tự động tạm dừng quá trình ghi vào kênh cho đến khi bộ đệm được giải phóng.

Toán tử chuyển hướng phổ biến nhất

STT Cú pháp Mô tả
1 tập tin lệnh Chuyển hướng đầu ra tiêu chuẩn tới tập tin mới

2 lệnh 1 tệp Chuyển hướng đầu ra tiêu chuẩn tới tệp được chỉ định

Lệnh 3 tập tin Chuyển hướng đầu ra tiêu chuẩn tới tập tin được chỉ định (chế độ đính kèm)

4 tệp lệnh 2&1 Chuyển hướng đầu ra tiêu chuẩn và lỗi tới tệp được chỉ định

Tệp lệnh 5 2 Chuyển hướng lỗi tiêu chuẩn tới tệp được chỉ định

6 lệnh 2 tập tin Chuyển hướng lỗi tiêu chuẩn tới tập tin được chỉ định (chế độ nối thêm)

7 tệp lệnh 2&1 Chuyển hướng đầu ra tiêu chuẩn và lỗi tới tệp được chỉ định (chế độ đính kèm)

8 lệnh file1 file2 Nhận đầu vào từ tệp đầu tiên và gửi đầu ra sang tệp thứ hai

Tệp lệnh 9 làm đầu vào tiêu chuẩn nhận dữ liệu từ tệp được chỉ định

10 lệnh phân cách Nhận dữ liệu từ đầu vào tiêu chuẩn cho đến khi gặp dấu phân cách

11 lệnh &m Nhận dữ liệu từ tập tin với ký hiệu mô tả m là đầu vào tiêu chuẩn

12 lệnh &m Chuyển hướng đầu ra tiêu chuẩn tới bộ mô tả tệp m

Toán tử n&m cho phép một tệp có bộ mô tả n được chuyển hướng đến cùng vị trí với tệp có bộ mô tả m. Có thể có một số toán tử tương tự trên dòng lệnh, trong trường hợp đó chúng được tính từ trái sang phải.

lệnh exec và sử dụng bộ mô tả tập tin

Lệnh exec thay thế trình thông dịch shell hiện tại bằng lệnh được chỉ định. Thông thường, nó được sử dụng để đóng trình thông dịch hiện tại và khởi động một trình thông dịch khác. Nhưng nó cũng có những công dụng khác.

Ví dụ: một lệnh như

Tệp Exec làm cho tệp được chỉ định trở thành đầu vào tiêu chuẩn của tất cả các lệnh. Thực hiện nó trong
không có ích gì trong chế độ tương tác - nó được thiết kế để sử dụng trong các tập lệnh,
để tất cả các lệnh đến sau nó đọc dữ liệu đầu vào từ tệp. Trong trường hợp này
phải có lệnh ở cuối tập lệnh

Exec & – đóng luồng đầu vào tiêu chuẩn (trong trường hợp này là tệp). Một kỹ thuật tương tự được sử dụng
chủ yếu ở các tập lệnh chạy khi bạn đăng xuất.

Lệnh exec là một con trỏ tới một tệp có bộ mô tả 0 (stdin). Con trỏ này chỉ có thể được khôi phục sau khi tập lệnh chạy xong.
Nếu tập lệnh có ý định tiếp tục đọc dữ liệu từ bàn phím thì bạn cần lưu
con trỏ tới luồng đầu vào trước đó. Dưới đây là một đoạn script ngắn minh họa cách thực hiện việc này.

$ mèo f_desc
#!/bin/bash
thực thi 3&0 0 tập tin
đọc dòng chữ
đọc dòng 2
thực thi 0&3
tiếng vang $1inel
tiếng vang $line2

Lệnh exec đầu tiên lưu trữ một con trỏ tới đầu vào tiêu chuẩn (stdin) trong bộ mô tả tệp 3
(bất kỳ số nguyên nào từ 3 đến 9 đều được phép) và sau đó mở ra tập tin tập tinđể đọc. Hai lệnh đọc tiếp theo
đọc hai dòng văn bản từ một tập tin. Lệnh exec thứ hai khôi phục con trỏ về đầu vào tiêu chuẩn: bây giờ
nó được liên kết với tệp stdin, không phải tệp. Lệnh echo cuối cùng hiển thị nội dung của dòng đọc trên màn hình,
được lưu trữ trong các biến linel và Iine2.

Kết quả của kịch bản:
$./f_desc
Xin chào!
Tạm biệt!

  • Dịch

Nếu bạn đã nắm vững kiến ​​thức cơ bản về terminal, bạn có thể sẵn sàng kết hợp các lệnh đã học. Đôi khi việc thực thi từng lệnh shell một lần là đủ để giải quyết một vấn đề nào đó, nhưng trong một số trường hợp, việc nhập hết lệnh này đến lệnh khác là quá tẻ nhạt và phi lý. TRONG tình huống tương tự chúng ta có thể sử dụng một số ký tự đặc biệt, giống như dấu ngoặc nhọn.

Đối với shell, trình thông dịch Lệnh Linux, những cái này ký tự bổ sung- không lãng phí không gian màn hình. Họ là những đội mạnh mẽ có thể gắn kết các phần thông tin khác nhau lại với nhau, tách biệt những gì trước đây là toàn bộ và làm được nhiều hơn thế. Một trong những tính năng đơn giản nhất nhưng mạnh mẽ nhất và được sử dụng rộng rãi của shell là chuyển hướng các luồng đầu vào/đầu ra tiêu chuẩn.

Ba luồng I/O tiêu chuẩn

Để hiểu những gì chúng ta sắp nói ở đây, điều quan trọng là phải biết dữ liệu có thể được chuyển hướng đến từ đâu và đi đâu. Linux có ba luồng I/O tiêu chuẩn.

Đầu tiên là luồng đầu vào tiêu chuẩn. Trong hệ thống, đây là luồng số 0 (vì trong máy tính, việc đếm thường bắt đầu từ số 0). Số luồng còn được gọi là mô tả. Luồng này thể hiện một số thông tin được truyền đến thiết bị đầu cuối, đặc biệt là các hướng dẫn được truyền tới shell để thực thi. Thông thường, dữ liệu đi vào luồng này khi người dùng nhập nó từ bàn phím.

Luồng thứ hai là luồng đầu ra tiêu chuẩn, được đánh số 1. Đây là luồng dữ liệu mà shell xuất ra sau khi thực hiện một số hành động. Thông thường, dữ liệu này kết thúc trong cùng một cửa sổ đầu cuối nơi nhập lệnh khiến nó xuất hiện.

Và cuối cùng, luồng thứ ba là luồng lỗi tiêu chuẩn, nó có số xử lý 2. Luồng này tương tự như luồng đầu ra tiêu chuẩn, vì thông thường những gì đi vào nó sẽ kết thúc trên màn hình đầu cuối. Tuy nhiên, nó vốn khác với đầu ra tiêu chuẩn và do đó, các luồng này có thể được kiểm soát riêng nếu muốn. Điều này rất hữu ích, ví dụ, trong tình huống sau đây. Có một nhóm xử lý một lượng lớn dữ liệu, thực hiện một thao tác phức tạp và dễ xảy ra lỗi. Bạn muốn đảm bảo rằng tải trọng mà lệnh này tạo ra không bị trộn lẫn với các thông báo lỗi. Điều này đạt được thông qua việc chuyển hướng riêng biệt các luồng đầu ra và lỗi.

Như bạn có thể đã đoán, chuyển hướng I/O có nghĩa là làm việc với các luồng được mô tả ở trên và chuyển hướng dữ liệu đến nơi mà lập trình viên cần. Việc này được thực hiện bằng cách sử dụng các ký hiệu > và< в kết hợp khác nhau, việc sử dụng tùy thuộc vào nơi dữ liệu được chuyển hướng cuối cùng sẽ đi đến đâu.

Chuyển hướng đầu ra tiêu chuẩn

Giả sử bạn muốn tạo một tệp sẽ được ghi vào ngay hiện tại và thời gian. Để làm cho vấn đề dễ dàng hơn, có một lệnh, được đặt tên phù hợp date , trả về những gì chúng ta cần. Thông thường, các lệnh xuất dữ liệu ra đầu ra tiêu chuẩn. Để dữ liệu này xuất hiện trong tệp, bạn cần thêm ký hiệu > sau lệnh, trước tên tệp đích. Trước và sau > bạn cần đặt một khoảng trắng.

Khi sử dụng chuyển hướng, bất kỳ tệp nào được chỉ định sau > sẽ bị ghi đè. Nếu không có gì có giá trị trong tệp và nội dung của nó có thể bị mất, thì trong thiết kế của chúng tôi, nó được phép sử dụng tập tin hiện có. Thông thường tốt hơn là sử dụng Trường hợp như vậy tên của một tập tin chưa tồn tại. Tập tin này sẽ được tạo sau khi lệnh được thực thi. Hãy gọi nó là date.txt. Phần mở rộng tệp sau dấu chấm thường không quan trọng lắm, nhưng phần mở rộng giúp sắp xếp mọi thứ. Vì vậy, đây là lệnh của chúng tôi:

$date>date.txt
Điều này không có nghĩa là bản thân lệnh này cực kỳ hữu ích, tuy nhiên, dựa vào nó, chúng ta có thể làm được điều gì đó thú vị hơn. Giả sử bạn muốn biết lưu lượng truy cập của mình đang định tuyến lại trên Internet đến một số điểm cuối như thế nào bằng cách ghi lại dữ liệu hàng ngày. Lệnh traceroute sẽ giúp giải quyết vấn đề này, lệnh này báo cáo chi tiết về tuyến đường lưu lượng giữa máy tính của chúng ta và điểm cuối được chỉ định khi gọi lệnh dưới dạng URL. Dữ liệu bao gồm thông tin về tất cả các bộ định tuyến mà lưu lượng truy cập đi qua.

Vì chúng ta đã có một tệp có ngày tháng nên sẽ hoàn toàn hợp lý nếu chỉ cần thêm dữ liệu nhận được từ traceroute vào tệp này. Để thực hiện việc này, bạn cần sử dụng hai ký hiệu >, đặt lần lượt từng ký hiệu. Kết quả là đội mới, chuyển hướng đầu ra sang một tệp, nhưng không ghi đè lên nó mà thêm dữ liệu mới sau dữ liệu cũ, sẽ trông như thế này:

$ traceroute google.com >> date.txt
Bây giờ tất cả những gì chúng ta phải làm là thay đổi tên tệp thành tên nào đó có ý nghĩa hơn bằng cách sử dụng lệnh mv, lệnh này lấy tên tệp gốc làm đối số đầu tiên và tên tệp mới làm đối số thứ hai:

$ mv date.txt trace1.txt

Chuyển hướng đầu vào tiêu chuẩn

Sử dụng một dấu hiệu< вместо >chúng ta có thể chuyển hướng đầu vào tiêu chuẩn bằng cách thay thế nó bằng nội dung của một tệp.

Giả sử có hai tệp: list1.txt và list2.txt, mỗi tệp chứa danh sách các chuỗi chưa được sắp xếp. Mỗi danh sách có các thành phần riêng biệt nhưng một số thành phần trong danh sách giống nhau. Chúng ta có thể tìm các dòng nằm trong cả danh sách thứ nhất và thứ hai bằng cách sử dụng lệnh comm, nhưng trước khi sử dụng, danh sách phải được sắp xếp.

tồn tại lệnh sắp xếp, trả về danh sách đã sắp xếp cho thiết bị đầu cuối mà không lưu dữ liệu đã sắp xếp vào tệp mà nó được lấy. Bạn có thể gửi phiên bản đã sắp xếp của từng danh sách đến một tệp mới bằng lệnh >, sau đó sử dụng lệnh comm. Tuy nhiên, cách tiếp cận này sẽ yêu cầu ít nhất hai lệnh, mặc dù điều tương tự có thể được thực hiện trên một dòng mà không tạo ra các tệp không cần thiết.

Vì vậy chúng ta có thể sử dụng lệnh< для перенаправления отсортированной версии каждого файла команде comm . Вот что у нас получилось:

$ liên lạc<(sort list1.txt) <(sort list2.txt)
Các dấu ngoặc đơn ở đây có ý nghĩa tương tự như trong toán học. Shell xử lý các lệnh trong ngoặc đơn trước, sau đó mới đến mọi thứ khác. Trong ví dụ của chúng tôi, các dòng trong tệp được sắp xếp trước tiên, sau đó kết quả được chuyển tới lệnh comm, lệnh này sẽ hiển thị kết quả so sánh các danh sách.

Chuyển hướng luồng lỗi tiêu chuẩn

Cuối cùng, hãy nói về chuyển hướng lỗi tiêu chuẩn. Điều này có thể cần thiết, chẳng hạn như để tạo các tệp nhật ký có lỗi hoặc để kết hợp các thông báo lỗi và dữ liệu được một lệnh nhất định trả về trong một tệp.

Ví dụ: điều gì sẽ xảy ra nếu bạn muốn tìm kiếm thông tin trong toàn bộ hệ thống của mình về các giao diện không dây mà người dùng không có quyền root có thể truy cập được? Để làm điều này, bạn có thể sử dụng lệnh find mạnh mẽ.

Thông thường, khi người dùng bình thường chạy lệnh find trên toàn bộ hệ thống, nó sẽ xuất ra cả dữ liệu hữu ích và lỗi cho terminal. Đồng thời, thường có nhiều cái sau hơn cái trước, điều này gây khó khăn cho việc tìm thấy thứ bạn cần trong đầu ra lệnh. Giải pháp cho vấn đề này khá đơn giản: chỉ cần chuyển hướng luồng lỗi tiêu chuẩn đến một tệp bằng lệnh 2> (hãy nhớ, 2 là mô tả cho luồng lỗi tiêu chuẩn). Kết quả là, chỉ những gì lệnh gửi đến đầu ra tiêu chuẩn mới xuất hiện trên màn hình:

$ find/-name không dây 2> bị từ chối.txt
Phải làm gì nếu bạn cần lưu kết quả làm việc của nhóm vào tập tin riêng biệt mà không trộn lẫn dữ liệu này với thông tin lỗi? Vì các luồng có thể được chuyển hướng độc lập với nhau nên chúng ta có thể thêm lệnh để chuyển hướng đầu ra tiêu chuẩn sang một tệp ở cuối cấu trúc của mình:

$ find / -name không dây 2> bị từ chối.txt > Found.txt
Xin lưu ý rằng dấu ngoặc nhọn đầu tiên đi kèm với số - 2> và dấu ngoặc thứ hai không có số đó. Điều này là do đầu ra tiêu chuẩn có số điều khiển 1 và lệnh > nhằm mục đích chuyển hướng đầu ra tiêu chuẩn nếu không chỉ định số điều khiển.

Cuối cùng, nếu bạn muốn mọi thứ mà lệnh xuất ra đều nằm trong một tệp, bạn có thể chuyển hướng cả hai luồng đến cùng một vị trí bằng lệnh &>:

$ find / -name không dây &> results.txt

Kết quả

Ở đây chúng ta chỉ xem xét những điều cơ bản về cơ chế chuyển hướng luồng trong trình thông dịch lệnh Chuỗi Linux tuy nhiên, ngay cả những gì bạn học được ngày hôm nay cũng mang lại cho bạn những khả năng gần như không giới hạn. Và nhân tiện, giống như mọi thứ khác liên quan đến hoạt động trong thiết bị đầu cuối, việc thành thạo việc chuyển hướng luồng cần phải thực hành. Do đó, chúng tôi khuyên bạn nên bắt đầu thử nghiệm của riêng mình với > và< .

Gởi bạn đọc! Bạn có biết không ví dụ thú vị sử dụng tính năng chuyển hướng luồng trong Linux để giúp người mới sử dụng thoải mái hơn với kỹ thuật đầu cuối này?