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)