`>> 'หมายถึงอะไรในคำสั่งเทอร์มินัล


14

ฉันเจอคำสั่งที่ได้รับด้านล่าง -

$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile

จากสิ่งที่ฉันเดาได้มันอาจจะใช้สำหรับการยอมรับการเปลี่ยนแปลงใน. bash_profile แต่มันจะใช้อะไรกันแน่


26
เพียงเพื่อให้คุณรู้ว่าจะปรับปรุงอะไรในอนาคต: man bashเขียนด้วยภาษาที่ค่อนข้างเป็นทางการมันอาจจะยากที่จะเข้าใจ ในทางกลับกันวลีbash >>จะส่งคืนลิงก์ที่มีประโยชน์น้อยใน Google เป็นเรื่องจริงที่เราต้องการรวบรวมความรู้โดยไม่ต้องพึ่ง Google ด้วยเหตุนี้แม้แต่คำถามที่มีคำตอบที่ค้นหาได้ง่ายอาจเหมาะสม อย่างไรก็ตามความจริงที่คุณไม่ได้ให้คำตอบทันที (ดูฉันจะตอบคำถามของฉันเองได้อย่างไร ) หรือชี้ไปยังแหล่งข้อมูลที่มีอยู่ (ซึ่งคุณอาจต้องการความช่วยเหลือในการเข้าใจ) บ่งชี้ว่าการวิจัยขาด
Kamil Maciorowski

5
สำหรับภาพรวมโดยละเอียดของตัวดำเนินการเปลี่ยนเส้นทางบรรทัดคำสั่งดูunix.stackexchange.com/q/159513/85039
Sergiy Kolodyazhnyy

คำตอบ:


31

มันเปลี่ยนเส้นทาง stdout ของโปรแกรมก่อน>>และผนวกเข้ากับไฟล์ที่กำหนดหลังจาก


28
"โปรแกรมก่อน" หมายความว่าอย่างไร คำสั่งอย่างชัดเจน แต่การเปลี่ยนเส้นทางยังสามารถเขียนเป็นส่วนเสริมได้เช่น>> file command
rexkogitans

ตัวอย่าง. บน Ubuntu 18.04 ฉันสามารถพิมพ์ "apt search rust >> x" ส่วน "apt search rust" ค้นหาแพ็คเกจที่มีอยู่สำหรับคำว่า rust และจากนั้นส่งสิ่งนี้ให้เป็นมาตรฐาน (ปกติคือเทอร์มินัลในกรณีนี้) อย่างไรก็ตาม ">> x" บอกว่าจะเปลี่ยนเส้นทางการส่งออกไปยังจุดสิ้นสุดของไฟล์ "x" หากฉันต้องการแทนที่ไฟล์ฉันจะต้องมี ">" เพียงอันเดียว
NomadMaker

@rexkogitans มากกว่าแม้จะอยู่ตรงกลางของคำสั่งหากคุณต้องการทำให้โค้ดของคุณสับสนในการอ่าน echo a b >> c dจะผนวกไปยังไฟล์ที่ชื่อว่าa b d c
kasperd

@kasperd คุณยังสามารถกระจายการเปลี่ยนเส้นทาง stdin ในลำดับใดก็ได้นอกจากนี้
rexkogitans

48

คำตอบสั้น ๆ - >>ทำอะไร?

ด้วย>>คุณผนวกเอาท์พุทของคำสั่งไปยังไฟล์

คำสั่งตัวอย่างของคุณประกอบด้วยหลายส่วนโดยทั่วไป:

คำสั่ง >> ชื่อไฟล์

ดังนั้นผลลัพธ์ของcommandจะถูกผนวกเข้าfilenameด้วย


สิ่งที่เกิดขึ้นในกรณีที่เฉพาะเจาะจงของecho?

ในกรณีเฉพาะของคุณecho "…"คำสั่งจะส่งเอาต์พุตอาร์กิวเมนต์อาร์กิวเมนต์ไปที่“ stdout” ซึ่งเป็นชื่อที่เรียกว่า“ standard output descriptor” อาร์กิวเมนต์อินพุตที่echoจะตามด้วย newline ( \n) เพื่อให้คุณได้รับการขึ้นบรรทัดใหม่

ที่นี่“ descriptor เอาต์พุตมาตรฐาน” ไม่มีอะไรมากไปกว่าสตรีมเอาต์พุตที่แสดงในเชลล์ของคุณเมื่อคุณรันคำสั่ง (นั่นคือเมื่อคุณพิมพ์echo fooและกด Enter foo\nเป็นเอาต์พุตจริงของechoคำสั่งซึ่งแสดงโดยเชลล์ของคุณfooตามด้วยบรรทัดใหม่)

โดยทั่วไปสิ่งใดก็ตามที่เขียนไปยังบรรทัดคำสั่งของคุณกำลังใช้ stdout นอกจากนี้ยังมี descriptor อื่นที่เรียกว่า“ stderr” ซึ่งโดยทั่วไปจะใช้สำหรับข้อความแสดงข้อผิดพลาด มันจะถูกพิมพ์เหมือน stdout ดังนั้นบางครั้งพวกเขาอาจสลับกัน และมีตัวบ่งชี้ stdin ที่ใช้สำหรับอินพุต ดูบทความนี้สำหรับข้อมูลเพิ่มเติม

คุณเปลี่ยนเส้นทางเอาต์พุตในเชลล์ได้อย่างไร?

คุณสามารถเปลี่ยนเส้นทาง stdout ไปยัง file descriptor ซึ่งคุณสามารถทำได้กับหนึ่งในโอเปอเรเตอร์เหล่านี้:

  • >เปลี่ยนเส้นทางไปยังไฟล์อธิบาย มันจะสร้างไฟล์หากไม่มีอยู่หรือถ้ามีอยู่แล้วให้ตัดไฟล์ก่อนที่จะเขียน ไฟล์จะถูกเขียนทับด้วย stdout

  • >>ต่อท้ายไฟล์ descriptor มันจะสร้างไฟล์หากไม่มีอยู่

นอกจากนี้คุณยังสามารถเปลี่ยนเส้นทาง stderr โดยใช้2>หรือ2>>คล้ายกัน หรือคุณสามารถรวม stderr และ stdout เป็นไฟล์เดียว: 2>&1ทำเช่นนั้น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนเส้นทางและตัวอย่างเพิ่มเติมคุณสามารถอ่านบทแนะนำเล็ก ๆนี้

ฉันจะรู้ได้อย่างไรว่า shell code ชิ้นใดมีความหมายอย่างไร

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


7

สำหรับคนTLDRที่ต้องการดูตัวอย่าง

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

ดังนั้นหากไฟล์ "flintstones.txt" มี;

Fred
Barney

echo Dino >> flintstones.txt จะส่งผลให้มีการเพิ่ม 'Dino' ไว้ท้ายไฟล์

Fred
Barney
Dino

ฉันอยากจะแนะนำให้คุณเพิ่มตัวอย่างของecho Dino > flintstones.txtการแสดงเนื้อหาของมันจะเป็นเพียงDinoถ้าทำด้วยลูกศรขวาเดียว
JakeGould

-2

อีกครั้งถ้าคุณทำ

> somefile.txt

เนื้อหาทั้งหมดของไฟล์จะถูกล้าง


ทำไมคุณคัดลอกคำตอบอื่น ๆ
โตโต้

@ โตโต้ฉันไม่คิดว่าเขาจะทำ ดูเหมือนว่าจะ aditional และมีคุณค่ามาก
Volker Siegel

@ โตโต้โอ๊ะโอ! มองใกล้มันไม่ใช่กรณี ผิดแม้ในหลาย ๆ ด้าน แปลก - เขาใหม่ที่นี่ แต่ทำงานที่อื่น - ดังนั้นอาจไม่ใช่แค่หลอก
Volker Siegel

2
@VolkerSiegel: > fileล้างไฟล์ แต่>> fileไม่ทำอะไรเลย
โตโต้

แต่สิ่งนี้ไม่ตอบคำถามในทางใดทางหนึ่งและควรเป็นความคิดเห็น
phuclv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.