จะบอกพารามิเตอร์ใดที่จะถูกส่งไปยังคำสั่งด้วยโอเปอเรเตอร์โอเปอเรเตอร์


9

งานนี้:

$ echo "แจ้งเตือน - ส่ง HELLO" | ณ ตอนนี้

สิ่งนี้ไม่:

$ ที่ตอนนี้ <echo "แจ้งเตือน - ส่ง HELLO"

มันระบุว่า 'ไม่พบไฟล์หรือไดเรกทอรี "

ฉันเข้าใจว่ามี-fตัวเลือกสำหรับคำสั่งนี้ซึ่งฉันสามารถจัดหาไฟล์ที่จะดำเนินการในช่วงเวลาที่กำหนด

ดังนั้นนี่ทำให้ฉันคิดว่า ... โดยทั่วไปฉันจะทราบได้อย่างไรว่าพารามิเตอร์ใดที่ผู้ดำเนินการเปลี่ยนเส้นทางจัดหาค่า


5
คำถามของคุณไม่ชัดเจน คุณหมายถึงอะไรโดย "พารามิเตอร์ใด" ปัญหาของคุณอาจเป็นไปได้ว่าคุณ (คิดผิด) คิดอย่างนั้นfoo | barและbar < fooเทียบเท่า พวกเขาจะไม่.
terdon

คำตอบ:


16

คุณกำลังใช้สองสิ่งที่แตกต่างกันที่นี่และควรใช้สิ่งที่สาม มาดูกัน:

  1. |: นี่คือตัวดำเนินการไปป์ซึ่งทำหน้าที่ส่งผ่านเอาต์พุตของกระบวนการหนึ่งเป็นอินพุตไปยังอีกกระบวนการ:

    foo | bar

    นี้จะทำงานโปรแกรมfooและผ่านการส่งออกเป็น input barในการเขียนโปรแกรม

  2. >, <, >>และ<<: เหล่านี้เป็นผู้ประกอบการเปลี่ยนเส้นทางที่พวกเขาทำหน้าที่ในการส่งข้อมูลไปยัง / จากไฟล์ :

    • foo > bar: รันโปรแกรมfooและบันทึกผลลัพธ์ไปยังไฟล์ bar , เขียนทับเนื้อหาของมัน1และสร้างมันถ้ามันไม่มีอยู่

    • foo >> bar: รันโปรแกรมfooและบันทึกการส่งออกไปยังไฟล์ bar , ผนวกกับเนื้อหาและสร้างมันถ้ามันไม่ได้อยู่

    • foo < bar: ทำงานได้fooบอกว่ามันจะอ่านข้อมูลจากไฟล์ bar

    • <<เป็นกรณีพิเศษเนื่องจากมีจุดในการ "ต่อท้าย" เข้ากับคำสั่งไม่มี<<เป็นหลัก (เฉพาะ AFAIK) ใช้สำหรับที่นี่เอกสาร :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF

      โครงสร้าง<< SomeStringHere > Out.fileจะเปลี่ยนเส้นทางข้อความทั้งหมดที่เขียนจนกว่าจะพบสตริงสิ้นสุด ( EOFในตัวอย่างด้านบน) ไปยังไฟล์เป้าหมาย ที่นี่เอกสารช่วยให้คุณสามารถจัดรูปแบบสตริงหลายบรรทัดได้ง่ายและรวมถึงตัวแปรและอักขระพิเศษ

  3. ตัว<<<ดำเนินการสตริงที่นี่เป็นเหมือนเอกสารที่นี่ แต่มันจะขยายตัวแปร ตัวอย่างเช่น:

    grep foo <<< "$bar"

    echo "$bar" | grep fooคำสั่งดังกล่าวเทียบเท่ากับ

  4. สิ่งที่คุณกำลังมองหาจริงๆเรียกว่าการทดแทนกระบวนการและเป็นอีกวิธีหนึ่งในการส่งผ่านผลลัพธ์ของคำสั่งไปยังอีก <(command)มันประกอบด้วย

    foo <(bar) 

    ดังนั้นสำหรับatตัวอย่างของคุณคุณสามารถทำได้

    at now < <(echo "notify-send HELLO")

    ผลงานข้างต้นเพราะเปลี่ยนตัวกระบวนการจริงสร้างแฟ้ม (อ่านลิงค์ข้างต้นสำหรับรายละเอียดเพิ่มเติม) และมันเป็นสิ่งที่อธิบายไฟล์ของไฟล์ที่ถูกส่งผ่านไปกับการ<at now


1พฤติกรรมเริ่มต้นคือการเขียนทับซึ่งสามารถแก้ไขได้โดยการตั้งค่าnoclobberตัวเลือกเพื่อทุบตี หากตั้งไว้echo foo > barจะล้มเหลวหากbarมีอยู่ ในกรณีนั้นสามารถบังคับใช้echo foo |> barแทน โปรดดูที่ส่วน 3.6.2 ที่นี่


1
คำตอบที่ดี! ละเอียดมาก (โดยเฉพาะอย่างยิ่งรวมถึงความแตกต่างระหว่างตัวเปลี่ยนเส้นทางไฟล์)
steeldriver

@steeldriver aww, shucks, ขอบคุณ :) และเป็นเช่นนี้ภายใต้อัญมณีชื่นชม ฉันหวังว่าฉันจะให้ +1 กับคุณสำหรับข้อผิดพลาดต่าง ๆ ที่แต่ละโซลูชันของคุณหลีกเลี่ยงอย่างเงียบ ๆ
terdon

คุณช่วยกรุณาขยายเพื่อรวมข้อมูลบางอย่างเกี่ยวกับ<<และ<<<(ซึ่ง @steeldriver พูดถึงในคำตอบของเขา) นอกจากนี้จะมีมากขึ้น - สิ่งที่ต้องการ>>>>>>หรือ<<<<<<<<<<?
Aditya

@Aditya เสร็จแล้ว และไม่ต้องกังวลก็หยุดที่<<<:)
terdon

12

ในกรณีนี้echo "notify-send HELLO"คือกระบวนการไม่ใช่ไฟล์ - ดังนั้นคุณต้องทดแทนกระบวนการแทนการเปลี่ยนเส้นทางไฟล์

at now < <(echo "notify-send HELLO")

คุณสามารถใช้สตริงที่นี่เพื่อหลีกเลี่ยงechoคำสั่งทั้งหมด

at now <<< "notify-send HELLO"

5
เห็นมีชนิดของคำถามที่คุณมีแนวโน้มที่จะชอบ (คนเดียวกับที่ฉันทำ) ฉันคิดว่าคุณควรจะใช้เวลามากขึ้นบางกว่าบนUnix และ Linux เรามีชีวิตอยู่และตายเพราะกลเม็ดเด็ดพรายที่นั่น ..
terdon

@terdon: สิ่งเดียวกันสำหรับนักกอล์ฟ Perl?
Sylvain Pineau

1
@SylvainPineau oooh ใช่ เป็นอย่างมาก :) อย่างจริงจังคำถามประเภทที่คุณเหล็กและฉันสนุกกับการมีมากขึ้นที่นั่น สถานที่ที่เต็มไปด้วย geeks commandline บางส่วน ของ ผู้ที่มีความรู้อย่างไร้เหตุผล
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.