Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Đọc và ghi dữ liệu từ mọi nơi với chuyển hướng trong thiết bị đầu cuối Linux

Chuyển hướng đầu vào và đầu ra là một chức năng tự nhiên của bất kỳ ngôn ngữ lập trình hoặc kịch bản nào. Về mặt kỹ thuật, nó vốn dĩ xảy ra bất cứ khi nào bạn tương tác với máy tính. Đầu vào được đọc từ stdin (đầu vào chuẩn, thường là bàn phím hoặc chuột của bạn), đầu ra là stdout (đầu ra tiêu chuẩn, văn bản hoặc luồng dữ liệu) và lỗi được gửi tới stderr . Việc hiểu rằng các luồng dữ liệu này tồn tại cho phép bạn kiểm soát thông tin đi đâu khi bạn đang sử dụng shell, chẳng hạn như Bash hoặc Zsh.

Chuẩn trong, chuẩn ngoài và lỗi chuẩn tồn tại dưới dạng các vị trí hệ thống tệp trên Linux. Bạn có thể thấy chúng trong /dev :

$ ls /dev/std*
/dev/stderr@  /dev/stdin@  /dev/stdout@

Bạn không thể làm gì nhiều với chúng một cách trực tiếp, nhưng đôi khi sẽ hữu ích nếu coi chúng như những vị trí meta nơi bạn có thể gửi dữ liệu.

Những điều cơ bản về chuyển hướng rất đơn giản:sử dụng một số > các ký tự để chuyển hướng đầu ra và một số < các ký tự để chuyển hướng đầu vào.

Đang chuyển hướng đầu ra

Để ghi đầu ra của lệnh ls vào một tệp:

$ ls > list.txt

Bạn không thấy đầu ra của ls như bạn thường làm, vì đầu ra được ghi vào list.txt tệp thay vì màn hình của bạn. Trên thực tế, điều này rất linh hoạt, thậm chí bạn có thể sử dụng nó để sao chép nội dung của tệp này sang tệp khác. Nó cũng không cần phải là một tệp văn bản. Bạn có thể sử dụng chuyển hướng cho dữ liệu nhị phân:

$ cat image.png > picture.png

(Trong trường hợp bạn đang tự hỏi tại sao bạn lại muốn làm điều đó, thì đó là một biện pháp khắc phục đôi khi hữu ích về quyền đối với tệp.)

Đang chuyển hướng đầu vào

Bạn cũng có thể chuyển hướng đầu vào "thành" một lệnh. Điều này được cho là ít hữu ích hơn việc chuyển hướng đầu ra vì nhiều lệnh đã được mã hóa cứng để lấy đầu vào từ một đối số mà bạn cung cấp. Tuy nhiên, nó có thể hữu ích khi một lệnh yêu cầu một danh sách các đối số và bạn có các đối số đó trong một tệp và muốn nhanh chóng "sao chép và dán" chúng từ tệp vào thiết bị đầu cuối của bạn (ngoại trừ bạn thực sự không muốn sao chép và dán):

$ sudo dnf install $(<package.list)

Sử dụng phổ biến của chuyển hướng đầu vào là tài liệu tại đây (hoặc chỉ tại đây-doc viết tắt) và here-string kỹ thuật. Phương thức nhập này chuyển hướng một khối văn bản vào luồng đầu vào chuẩn, lên đến một điểm đánh dấu cuối tệp đặc biệt (hầu hết mọi người sử dụng EOF , nhưng nó có thể là bất kỳ chuỗi nào bạn muốn là duy nhất). Hãy thử nhập cái này (lên đến phiên bản thứ hai của EOF ) vào một thiết bị đầu cuối:

$ echo << EOF
> foo
> bar
> baz
> EOF

Kết quả mong đợi:

foo
bar
baz

A đây-tài liệu là một thủ thuật phổ biến được sử dụng bởi những người viết kịch bản Bash để kết xuất một số dòng văn bản vào một tệp hoặc lên màn hình. Miễn là bạn không quên kết thúc mệnh đề bằng điểm đánh dấu cuối tệp, đó là một cách hiệu quả để tránh các danh sách echo khó sử dụng hoặc printf tuyên bố.

A chuỗi tại đây tương tự như here-doc , nhưng nó chỉ bao gồm một chuỗi (hoặc một số chuỗi được ngụy trang thành một chuỗi duy nhất có dấu ngoặc kép):

$ cat <<< "foo bar baz"
foo bar baz

Chuyển hướng thông báo lỗi

Thông báo lỗi chuyển đến luồng có tên stderr , được chỉ định là 2> cho các mục đích chuyển hướng. Lệnh này chuyển hướng thông báo lỗi đến một tệp có tên output.log :

$ ls /nope 2> output.log

Gửi dữ liệu tới / dev / null

Cũng giống như có các vị trí cho tiêu chuẩn trong, tiêu chuẩn ra và lỗi, cũng có một vị trí cho hư không trên hệ thống tệp Linux. Nó được gọi là null và nó nằm trong /dev , vì vậy nó thường được phát âm là "devnull" bởi những người sử dụng nó quá thường xuyên để nói "chém dev chém null."

Bạn có thể gửi dữ liệu tới /dev/null sử dụng chuyển hướng. Ví dụ:find lệnh có xu hướng dài dòng và nó thường báo cáo xung đột quyền khi tìm kiếm thông qua các tệp của bạn:

$ find ~ -type f 
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file

find lệnh xử lý lỗi, vì vậy bạn có thể chỉ chuyển hướng các thông báo lỗi đến /dev/null :

$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file

Sử dụng chuyển hướng

Chuyển hướng là một cách hiệu quả để lấy dữ liệu từ nơi này đến nơi khác trong Bash. Bạn có thể không sử dụng tính năng chuyển hướng mọi lúc, nhưng học cách sử dụng nó khi bạn cần nó có thể giúp bạn tiết kiệm rất nhiều tệp mở không cần thiết cũng như sao chép và dán dữ liệu, tất cả đều yêu cầu di chuyển chuột và nhiều lần nhấn phím. Đừng dùng đến những điều quá khích như vậy. Sống một cuộc sống tốt đẹp và sử dụng chuyển hướng.