Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

อ่านและเขียนข้อมูลจากทุกที่ด้วยการเปลี่ยนเส้นทางในเทอร์มินัล Linux

การเปลี่ยนเส้นทางของอินพุตและเอาต์พุตเป็นหน้าที่ตามธรรมชาติของการเขียนโปรแกรมหรือภาษาสคริปต์ใดๆ ในทางเทคนิค มันเกิดขึ้นโดยธรรมชาติเมื่อใดก็ตามที่คุณโต้ตอบกับคอมพิวเตอร์ อินพุตถูกอ่านจาก stdin (อินพุตมาตรฐาน โดยปกติคือแป้นพิมพ์หรือเมาส์ของคุณ) เอาต์พุตไปที่ stdout (เอาต์พุตมาตรฐาน ข้อความหรือสตรีมข้อมูล) และข้อผิดพลาดจะถูกส่งไปยัง stderr . การเข้าใจว่ามีสตรีมข้อมูลเหล่านี้อยู่ช่วยให้คุณควบคุมได้ว่าข้อมูลจะไปที่ใดเมื่อคุณใช้เชลล์ เช่น Bash หรือ Zsh

Standard in, standard out และข้อผิดพลาดมาตรฐานมีอยู่ในตำแหน่งระบบไฟล์บน Linux คุณสามารถดูได้ใน /dev :

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

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

พื้นฐานของการเปลี่ยนเส้นทางนั้นง่าย:ใช้ > . จำนวนหนึ่ง อักขระเพื่อเปลี่ยนเส้นทางเอาต์พุตและจำนวน < อักขระเพื่อเปลี่ยนเส้นทางอินพุต

กำลังเปลี่ยนเส้นทางเอาต์พุต

วิธีเขียนผลลัพธ์ของคำสั่ง ls ไปยังไฟล์:

$ ls > list.txt

คุณไม่เห็นผลลัพธ์ของ ls ตามปกติ เพราะผลลัพธ์ถูกเขียนไปยัง list.txt ไฟล์แทนหน้าจอของคุณ มันใช้งานได้หลากหลาย อันที่จริง คุณสามารถใช้มันเพื่อคัดลอกเนื้อหาของไฟล์หนึ่งไปยังอีกไฟล์หนึ่งได้ ไม่จำเป็นต้องเป็นไฟล์ข้อความเช่นกัน คุณสามารถใช้การเปลี่ยนเส้นทางสำหรับข้อมูลไบนารี:

$ cat image.png > picture.png

(ในกรณีที่คุณสงสัยว่าทำไมคุณถึงต้องการทำเช่นนั้น บางครั้งอาจเป็นประโยชน์ต่อการอนุญาตของไฟล์)

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

คุณสามารถเปลี่ยนเส้นทางอินพุต "เป็น" คำสั่งได้เช่นกัน สิ่งนี้มีประโยชน์น้อยกว่าการเปลี่ยนเส้นทางเอาต์พุตเนื่องจากคำสั่งจำนวนมากได้รับการฮาร์ดโค้ดแล้วเพื่อรับอินพุตจากอาร์กิวเมนต์ที่คุณระบุ อย่างไรก็ตาม อาจมีประโยชน์เมื่อคำสั่งคาดหวังรายการอาร์กิวเมนต์ และคุณมีอาร์กิวเมนต์เหล่านั้นในไฟล์ และต้องการ "คัดลอกและวาง" อย่างรวดเร็วจากไฟล์ลงในเทอร์มินัลของคุณ (ยกเว้นว่าคุณไม่ต้องการคัดลอกจริงๆ และวาง):

$ sudo dnf install $(<package.list)

การใช้งานทั่วไปของการเปลี่ยนเส้นทางอินพุตคือ เอกสารที่นี่ (หรือเพียงแค่ ที่นี่-doc สั้นๆ) และ here-string เทคนิคต่างๆ วิธีการป้อนข้อมูลนี้เปลี่ยนเส้นทางกลุ่มข้อความไปยังสตรีมอินพุตมาตรฐาน จนถึงเครื่องหมายท้ายไฟล์พิเศษ (คนส่วนใหญ่ใช้ EOF แต่อาจเป็นสตริงใดก็ได้ที่คุณคาดว่าจะไม่ซ้ำกัน) ลองพิมพ์สิ่งนี้ (สูงสุดอินสแตนซ์ที่สองของ EOF ) ลงในเทอร์มินัล:

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

ผลลัพธ์ที่คาดหวัง:

foo
bar
baz

เอกสารที่นี่ เป็นเคล็ดลับทั่วไปที่ Bash scripters ใช้ในการดัมพ์ข้อความหลายบรรทัดลงในไฟล์หรือลงบนหน้าจอ ตราบใดที่คุณไม่ลืมปิดท้ายประโยคด้วยเครื่องหมายสิ้นสุดไฟล์ วิธีนี้เป็นวิธีที่มีประสิทธิภาพในการหลีกเลี่ยงรายการ echo ที่ไม่เหมาะสม หรือ printf แถลงการณ์

ที่นี่สตริง คล้ายกับ เอกสารที่นี่ แต่ประกอบด้วยสตริงเดียวเท่านั้น (หรือหลายสตริงที่ปลอมแปลงเป็นสตริงเดียวพร้อมเครื่องหมายอัญประกาศ):

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

การเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาด

ข้อความแสดงข้อผิดพลาดไปที่สตรีมชื่อ stderr กำหนดเป็น 2> เพื่อวัตถุประสงค์ในการเปลี่ยนเส้นทาง คำสั่งนี้นำข้อความแสดงข้อผิดพลาดไปยังไฟล์ชื่อ output.log :

$ ls /nope 2> output.log

กำลังส่งข้อมูลไปที่ /dev/null

เช่นเดียวกับที่มีสถานที่สำหรับมาตรฐานเข้า มาตรฐานออก และข้อผิดพลาด ก็ยังมีสถานที่สำหรับไม่มีที่ไหนเลย บนระบบไฟล์ลินุกซ์ เรียกว่า null และอยู่ใน /dev ดังนั้นจึงมักออกเสียงว่า "devnull" โดยผู้ที่ใช้บ่อยเกินไปที่จะพูดว่า "slash dev slash null"

คุณสามารถส่งข้อมูลไปที่ /dev/null โดยใช้การเปลี่ยนเส้นทาง ตัวอย่างเช่น find คำสั่งมีแนวโน้มที่จะใช้คำฟุ่มเฟือย และมักจะรายงานข้อขัดแย้งในการอนุญาตขณะค้นหาไฟล์ของคุณ:

$ 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 คำสั่งประมวลผลว่าเป็นข้อผิดพลาด ดังนั้นคุณสามารถเปลี่ยนเส้นทางเฉพาะข้อความแสดงข้อผิดพลาดไปที่ /dev/null :

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

การใช้การเปลี่ยนเส้นทาง

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