Unix / Linux - การเปลี่ยนเส้นทางอินพุต / เอาต์พุตของเชลล์

ในบทนี้เราจะพูดถึงรายละเอียดเกี่ยวกับการเปลี่ยนเส้นทางอินพุต / เอาต์พุตของเชลล์ คำสั่งระบบ Unix ส่วนใหญ่รับอินพุตจากเทอร์มินัลของคุณและส่งผลลัพธ์ที่ได้กลับไปที่เทอร์มินัลของคุณ โดยปกติคำสั่งจะอ่านอินพุตจากอินพุตมาตรฐานซึ่งจะเป็นเทอร์มินัลของคุณตามค่าเริ่มต้น ในทำนองเดียวกันคำสั่งมักจะเขียนเอาต์พุตไปยังเอาต์พุตมาตรฐานซึ่งเป็นเทอร์มินัลของคุณอีกครั้งตามค่าเริ่มต้น

การเปลี่ยนทิศทางเอาต์พุต

ผลลัพธ์จากคำสั่งโดยปกติมีไว้สำหรับเอาต์พุตมาตรฐานสามารถเปลี่ยนไปยังไฟล์แทนได้อย่างง่ายดาย ความสามารถนี้เรียกว่าการเปลี่ยนเส้นทางเอาต์พุต

หากไฟล์สัญกรณ์> ต่อท้ายคำสั่งใด ๆ ที่โดยปกติเขียนเอาต์พุตไปยังเอาต์พุตมาตรฐานเอาต์พุตของคำสั่งนั้นจะถูกเขียนลงในไฟล์แทนเทอร์มินัลของคุณ

ตรวจสอบสิ่งต่อไปนี้ who คำสั่งที่เปลี่ยนทิศทางผลลัพธ์ทั้งหมดของคำสั่งในไฟล์ผู้ใช้

$ who > users

สังเกตว่าไม่มีเอาต์พุตปรากฏที่เทอร์มินัล เนื่องจากเอาต์พุตถูกเปลี่ยนทิศทางจากอุปกรณ์เอาต์พุตมาตรฐานเริ่มต้น (เทอร์มินัล) ไปยังไฟล์ที่ระบุ คุณสามารถตรวจสอบไฟล์ผู้ใช้สำหรับเนื้อหาทั้งหมด -

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

หากคำสั่งมีเอาต์พุตที่เปลี่ยนทิศทางไปยังไฟล์และไฟล์นั้นมีข้อมูลบางส่วนอยู่แล้วข้อมูลนั้นจะสูญหายไป ลองพิจารณาตัวอย่างต่อไปนี้ -

$ echo line 1 > users
$ cat users
line 1
$

คุณสามารถใช้ >> ตัวดำเนินการเพื่อต่อท้ายผลลัพธ์ในไฟล์ที่มีอยู่ดังต่อไปนี้ -

$ echo line 2 >> users
$ cat users
line 1
line 2
$

การเปลี่ยนทิศทางอินพุต

เช่นเดียวกับที่เอาต์พุตของคำสั่งสามารถเปลี่ยนเส้นทางไปยังไฟล์ได้ดังนั้นอินพุตของคำสั่งจึงสามารถเปลี่ยนเส้นทางจากไฟล์ได้ ในฐานะที่เป็นgreater-than character > ใช้สำหรับการเปลี่ยนทิศทางเอาต์พุตไฟล์ less-than character < ใช้เพื่อเปลี่ยนทิศทางอินพุตของคำสั่ง

คำสั่งที่โดยปกติรับอินพุตจากอินพุตมาตรฐานสามารถมีการเปลี่ยนทิศทางอินพุตจากไฟล์ในลักษณะนี้ ตัวอย่างเช่นในการนับจำนวนบรรทัดในไฟล์ที่ผู้ใช้สร้างขึ้นด้านบนคุณสามารถดำเนินการคำสั่งดังต่อไปนี้ -

$ wc -l users
2 users
$

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ต่อไปนี้ คุณสามารถนับจำนวนบรรทัดในไฟล์ได้โดยเปลี่ยนเส้นทางอินพุตมาตรฐานของไฟล์wcคำสั่งจากผู้ใช้ไฟล์-

$ wc -l < users
2
$

โปรดสังเกตว่ามีความแตกต่างในเอาต์พุตที่สร้างโดยคำสั่ง wc สองรูปแบบ ในกรณีแรกชื่อของผู้ใช้ไฟล์จะแสดงพร้อมกับจำนวนบรรทัด ในกรณีที่สองมันไม่ใช่

ในกรณีแรก wc รู้ว่ากำลังอ่านอินพุตจากผู้ใช้ไฟล์ ในกรณีที่สองจะรู้เพียงว่ากำลังอ่านอินพุตจากอินพุตมาตรฐานดังนั้นจึงไม่แสดงชื่อไฟล์

เอกสารที่นี่

here document ใช้เพื่อเปลี่ยนทิศทางอินพุตไปยังเชลล์สคริปต์หรือโปรแกรมแบบโต้ตอบ

เราสามารถรันโปรแกรมแบบโต้ตอบภายในเชลล์สคริปต์โดยไม่ต้องดำเนินการกับผู้ใช้โดยการจัดหาอินพุตที่จำเป็นสำหรับโปรแกรมแบบโต้ตอบหรือเชลล์สคริปต์แบบโต้ตอบ

แบบฟอร์มทั่วไปสำหรับไฟล์ here เอกสารคือ -

command << delimiter
document
delimiter

ที่นี่เชลล์ตีความไฟล์ <<ตัวดำเนินการเป็นคำสั่งในการอ่านอินพุตจนกว่าจะพบบรรทัดที่มีตัวคั่นที่ระบุ บรรทัดอินพุตทั้งหมดจนถึงบรรทัดที่มีตัวคั่นจะถูกป้อนเข้าในอินพุตมาตรฐานของคำสั่ง

ตัวคั่นบอกเชลล์ว่า hereเอกสารเสร็จสมบูรณ์ หากไม่มีมันเชลล์จะอ่านอินพุตตลอดไป ตัวคั่นต้องเป็นคำเดียวที่ไม่มีช่องว่างหรือแท็บ

ต่อไปนี้เป็นอินพุตของคำสั่ง wc -l เพื่อนับจำนวนบรรทัดทั้งหมด -

$wc -l << EOF
   This is a simple lookup program 
	for good (and bad) restaurants
	in Cape Town.
EOF
3
$

คุณสามารถใช้ไฟล์ here document เพื่อพิมพ์หลายบรรทัดโดยใช้สคริปต์ของคุณดังนี้ -

#!/bin/sh

cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

สคริปต์ต่อไปนี้รันเซสชันด้วย vi แก้ไขข้อความและบันทึกอินพุตในไฟล์ test.txt.

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

หากคุณเรียกใช้สคริปต์นี้โดย vim ทำหน้าที่เป็น vi คุณจะเห็นผลลัพธ์ดังต่อไปนี้ -

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

หลังจากเรียกใช้สคริปต์คุณจะเห็นสิ่งต่อไปนี้เพิ่มลงในไฟล์ test.txt -

$ cat test.txt
This file was created automatically from
a shell script
$

ทิ้งเอาต์พุต

บางครั้งคุณจะต้องดำเนินการคำสั่ง แต่คุณไม่ต้องการให้ผลลัพธ์แสดงบนหน้าจอ ในกรณีเช่นนี้คุณสามารถละทิ้งผลลัพธ์โดยเปลี่ยนเส้นทางไปยังไฟล์/dev/null -

$ command > /dev/null

คำสั่งนี่คือชื่อของคำสั่งที่คุณต้องการเรียกใช้ ไฟล์/dev/null เป็นไฟล์พิเศษที่ละทิ้งอินพุตทั้งหมดโดยอัตโนมัติ

หากต้องการละทิ้งทั้งเอาต์พุตของคำสั่งและเอาต์พุตข้อผิดพลาดให้ใช้การเปลี่ยนเส้นทางมาตรฐานเพื่อเปลี่ยนเส้นทาง STDERR ถึง STDOUT -

$ command > /dev/null 2>&1

ที่นี่ 2 แสดงถึง STDERR และ 1 แสดงถึง STDOUT. คุณสามารถแสดงข้อความบน STDERR ได้โดยเปลี่ยนเส้นทาง STDOUT ไปยัง STDERR ดังนี้ -

$ echo message 1>&2

คำสั่งการเปลี่ยนเส้นทาง

ต่อไปนี้เป็นรายการคำสั่งทั้งหมดที่คุณสามารถใช้สำหรับการเปลี่ยนเส้นทาง -

ซีเนียร์ คำสั่งและคำอธิบาย
1

pgm > file

เอาต์พุตของ pgm ถูกเปลี่ยนเส้นทางไปยังไฟล์

2

pgm < file

โปรแกรม pgm อ่านอินพุตจากไฟล์

3

pgm >> file

เอาต์พุตของ pgm ถูกผนวกเข้ากับไฟล์

4

n > file

เอาต์พุตจากสตรีมพร้อมตัวบอก n เปลี่ยนเส้นทางไปยังไฟล์

5

n >> file

เอาต์พุตจากสตรีมพร้อมตัวบอก n ต่อท้ายไฟล์

6

n >& m

ผสานเอาต์พุตจากสตรีม n กับสตรีม m

7

n <& m

รวมอินพุตจากสตรีม n กับสตรีม m

8

<< tag

อินพุตมาตรฐานมาจากที่นี่ผ่านแท็กถัดไปที่จุดเริ่มต้นของบรรทัด

9

|

รับเอาต์พุตจากโปรแกรมหรือกระบวนการหนึ่งและส่งไปยังอีกโปรแกรมหนึ่ง

โปรดสังเกตว่า file descriptor 0 ปกติเป็นอินพุตมาตรฐาน (STDIN) 1 เป็นเอาต์พุตมาตรฐาน (STDOUT) และ 2 เป็นเอาต์พุตข้อผิดพลาดมาตรฐาน (STDERR)