คำถามติดแท็ก stdout

stdout เป็นชื่อของ descriptor ไฟล์เอาต์พุตเริ่มต้นของกระบวนการ เนื่องจากไม่มีอะไรพิเศษเกี่ยวกับ "stdout" คุณ * ไม่ควรใช้แท็กนี้ ใช้แท็ก [io-redirection] สำหรับคำถามเกี่ยวกับวิธีเปลี่ยนเส้นทางเอาต์พุตใช้ [file-descriptors] สำหรับคำถามเกี่ยวกับวิธีจัดการตัวอธิบายไฟล์ใช้ [lock] สำหรับคำถามเกี่ยวกับการล็อกไฟล์และใช้ [files] สำหรับคำถามทั่วไปเกี่ยวกับ การทำงานของไฟล์

2
ท่อการไหลของข้อมูลในไปป์ไลน์เป็นอย่างไร
ฉันไม่เข้าใจว่าข้อมูลไหลในท่อและหวังว่าใครบางคนสามารถชี้แจงสิ่งที่เกิดขึ้นที่นั่น ฉันคิดว่าไพพ์ไลน์ของคำสั่งประมวลผลไฟล์ (ข้อความ, อาร์เรย์ของสตริง) ในลักษณะทีละบรรทัด (หากคำสั่งแต่ละคำสั่งใช้งานได้ทีละบรรทัด) แต่ละบรรทัดของข้อความจะผ่านไปป์ไลน์คำสั่งจะไม่รอให้การประมวลผลอินพุตทั้งหมดเสร็จสิ้นก่อนหน้า แต่ดูเหมือนว่ามันจะไม่เป็นเช่นนั้น นี่คือตัวอย่างการทดสอบ มีข้อความบางบรรทัด ฉันพิมพ์ใหญ่และทำซ้ำแต่ละบรรทัดสองครั้ง cat text | tr '[:lower:]' '[:upper:]' | sed 'p'ผมทำด้วย ที่จะปฏิบัติตามกระบวนการที่เราสามารถเรียกมันว่า "การโต้ตอบ" - catข้ามชื่อไฟล์การป้อนข้อมูลใน แต่ละส่วนของไปป์ไลน์ทำงานทีละบรรทัด: $ cat | tr '[:lower:]' '[:upper:]' alkjsd ALKJSD sdkj SDKJ $ cat | sed 'p' line1 line1 line1 line 2 line 2 line 2 แต่ไปป์ไลน์ที่สมบูรณ์รอให้ฉันเสร็จสิ้นอินพุตด้วยEOFและจากนั้นพิมพ์ผลลัพธ์: …

1
Linux: วิธีเปลี่ยนเส้นทาง stdout & stderr ไปยัง logger?
ฉันมีโปรแกรมที่ฉันจำเป็นต้องเรียกใช้เมื่อเริ่มต้นมันมีเอาต์พุตใน stdout และ stderr ที่ฉันต้องการเปลี่ยนเส้นทางไปยังบันทึกของระบบโดยใช้คำสั่ง logger สิ่งที่ฉันมีในสคริปต์เริ่มต้นคือ: / home / dirname / application_name -v | logger 2> & 1 & นี่คือการเปลี่ยนเส้นทาง stdout เพื่อ syslog ได้ดี แต่ stderr มาถึงคอนโซลดังนั้นฉันต้องปรับแต่งคำสั่ง

3
การพิมพ์คำสั่งอื่นไปยัง STDIN ปลอดภัยหรือไม่ในขณะที่คำสั่งก่อนหน้านี้กำลังเขียนไปยัง STDOUT
บางทีนี่อาจเป็นคำตอบก่อนหน้านี้ฉันยินดีต้อนรับลิงก์ไปยังคำตอบอื่น ... ถ้าฉันรันคำสั่งเชลล์ (ในbashเชลล์) เช่นต่อไปนี้: make จากนั้นในขณะที่ผลผลิตจากการmakeถูกเลื่อนโดยจากSTDOUTของmakeคำสั่งถ้าผมพิมพ์make checkและกดenterก่อนที่คำสั่งแรกเสร็จสิ้นการดำเนินการเมื่อmakeคำสั่งในที่สุดก็เสร็จสิ้นคำสั่งต่อไปmake checkจะรับสิทธิและเรียกใช้ คำถามของฉันเป็นเพียง: สิ่งนี้เป็นอันตรายหรือไม่? มีพฤติกรรมที่คาดไม่ถึงใด ๆ จากการพิมพ์ที่รวดเร็วเช่นนี้หรือไม่? ทำไมสิ่งนี้ถึงได้ผลเช่นนี้?
21 bash  shell  stdout  stdin 

2
จะทราบได้อย่างไรว่ากระบวนการใดที่เขียนถึง STDOUT
ฉันมีกระบวนการทำงานสองกรณี หนึ่งในนั้นคือ "frEAkIng oUT!" และข้อผิดพลาดการพิมพ์ไม่หยุดที่ STDOUT ฉันต้องการฆ่ากระบวนการที่เสียหาย แต่ฉันต้องทำให้แน่ใจว่าฉันจะไม่ยุติกระบวนการที่ผิด พวกเขาทั้งคู่เริ่มต้นพร้อมกันและใช้topฉันสามารถเห็นพวกเขาทั้งคู่ใช้หน่วยความจำและ CPU ในปริมาณเท่ากัน ฉันไม่สามารถหาสิ่งใดที่ชี้ให้เห็นว่ากระบวนการใดที่ทำงานไม่ดี สิ่งที่ปลอดภัยที่สุดคือการพิจารณาว่ากระบวนการใด / pid ที่เขียนไปยัง STDOUT มีวิธีใดที่จะทำเช่นนั้น?

4
bash: / dev / stderr: การอนุญาตถูกปฏิเสธ
หลังจากอัปเกรดเป็นเวอร์ชั่นใหม่แล้วbashสคริปต์ของฉันก็เริ่มพ่นข้อผิดพลาด: bash: /dev/stderr: Permission denied ในเวอร์ชันก่อนหน้า Bash จะจำชื่อไฟล์เหล่านั้นได้ภายใน (ซึ่งเป็นสาเหตุที่คำถามนี้ไม่ซ้ำกับของไฟล์นี้ ) และทำสิ่งที่ถูกต้อง (tm)อย่างไรก็ตามสิ่งนี้หยุดทำงานทันที ฉันจะทำอย่างไรจึงจะสามารถเรียกใช้สคริปต์ของฉันอีกครั้งได้สำเร็จ ฉันได้ลองเพิ่มผู้ใช้ที่เรียกใช้สคริปต์ไปยังกลุ่มttyแต่มันก็ไม่ได้ทำให้แตกต่าง (แม้หลังจากออกจากระบบแล้ว) ฉันสามารถทำซ้ำนี้ในบรรทัดคำสั่งโดยไม่มีปัญหา: $ echo test > /dev/stdout bash: /dev/stdout: Permission denied $ echo test > /dev/stderr bash: /dev/stderr: Permission denied $ ls -l /dev/stdout /dev/stderr lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stderr -> /proc/self/fd/2 …

4
ส่งออกไปยัง stdout และในเวลาเดียวกัน grep เป็นไฟล์
stdoutฉันมีสคริปต์ที่ข้อความขาออกไป ฉันต้องการที่จะเห็นผลลัพธ์ทั้งหมดนี้ใน terminal ของฉันและในเวลาเดียวกันฉันต้องการที่จะกรองบางบรรทัดและบันทึกไว้ในไฟล์ ตัวอย่าง: $ myscript Line A Line B Line C $ myscript | grep -P 'A|C' > out.file $ cat out.file Line A Line C ฉันต้องการเห็นเอาต์พุตของคำสั่งแรกในเทอร์มินัลและบันทึกผลลัพธ์ของคำสั่งที่สองในไฟล์ ในเวลาเดียวกัน. ฉันพยายามใช้teeแต่ไม่มีผลกับหรือดีกว่ามีผลตรงกันข้าม
18 grep  pipe  stdout  tee 

3
vim: บังคับใช้ไวยากรณ์เฉพาะผ่านอาร์กิวเมนต์บรรทัดคำสั่ง
เมื่อฉันต้องการอ่านสกีมา PostgreSQL ของฉันง่าย ๆ ฉันจะดัมพ์stderrและเปลี่ยนเส้นทางไปที่vim: pg_dump -h localhost -U postgres dog_food --schema-only | vim - สิ่งนี้ให้: vim ไม่มีสคีมาที่เน้นไวยากรณ์เนื่องจากไม่มีส่วนขยายชื่อไฟล์เมื่ออ่านจาก stdin ดังนั้นฉันจึงใช้สิ่งต่อไปนี้: :set syntax=sql ซึ่งจะช่วยให้: ในฐานะนักพัฒนาที่ขี้เกียจฉันอยากจะบังคับvimใช้ไวยากรณ์ SQL โดยผ่านอาร์กิวเมนต์บรรทัดคำสั่งช่วยให้ฉันเป็นนักร้องประสานเสียงของการพิมพ์ซ้ำset syntax=<whatever>ทุกครั้งที่ฉันเปิดมันด้วยstdinข้อมูล .. มีวิธีการตั้งค่าvimไวยากรณ์โดยผ่านอาร์กิวเมนต์บรรทัดคำสั่งหรือไม่

3
tee stdout ถึง stderr?
ฉันต้องการส่ง stdout จากกระบวนการหนึ่งไปยัง stdin ของกระบวนการอื่น แต่ก็รวมถึงคอนโซลด้วย ยกตัวอย่างเช่นส่ง stdout ไปที่ stdout + stderr ตัวอย่างเช่นฉันได้git editนามแฝงต่อไปนี้: git status --short | cut -b4- | xargs gvim --remote xargsฉันต้องการรายการชื่อไฟล์จะถูกส่งไปยังหน้าจอเช่นเดียวกับการ ดังนั้นมีteeยูทิลิตี้เหมือนที่จะทำเช่นนี้? เพื่อให้ฉันสามารถทำสิ่งที่ชอบ: git status --short | \ cut -b4- | almost-but-not-quite-entirely-unlike-tee | \ xargs gvim --remote

2
เขียนบรรทัดไปยังไฟล์จากน้อย
ในขณะที่vimฉันสามารถเขียนช่วงของบรรทัดจากไฟล์ที่ฉันกำลังดูไปยังไฟล์อื่น ตัวอย่างเช่น, :1,10 w outfile.txt จะเขียนบรรทัดที่ 1 ถึง 10 ถึง outfile.txt ฉันสามารถทำเช่นเดียวกันในขณะที่ฉันกำลังดูไฟล์โดยใช้lessหรือไม่?
17 less  stdout 

2
หน้าจอ GNU: พิมพ์เซสชันที่แยกออกไปยัง stdout
ฉันแค่ต้องการให้ภาพรวมอย่างรวดเร็วของscreenเซสชันGNU ที่แยกออกมาของฉัน เป็นไปได้ที่จะดัมพ์เนื้อหาปัจจุบันไปยัง stdout หรือไม่? สิ่งที่ต้องการ screen --print SESSION_NAME > file.txt

5
bash: ใช้ตัวแปรเพื่อเก็บการเปลี่ยนเส้นทาง stderr | stdout
มีวิธีการเปลี่ยนเส้นทาง stdout และ stderr ผ่านตัวแปรเช่นเพิ่มตัวเลือกคำสั่งในสคริปต์ใด ๆ ตัวอย่างเช่นฉันมีสคริปต์: #!/bin/bash -x TEST=">/dev/null 2>&1" OPT='-p -v' mkdir $OPT 123/123/123 $TEST ฉันเห็นว่า OPT ถูกแทนที่ด้วย-pไม่มีปัญหาใด ๆ และทุบตีตีความมันเป็นตัวเลือก แต่การเปลี่ยนเส้นทางตีความเป็นชื่อไดเรกทอรี $ ./test.sh + TEST='>/dev/null 2>&1' + OPT='-p -v' + mkdir -p -v 123/123/123 '>/dev/null' '2>&1' mkdir: created directory `123/123' mkdir: created directory `123/123/123' mkdir: created directory `>/dev' …

1
การหมุนไฟล์บันทึกขณะที่กระบวนการยังทำงานอยู่
/var/log/dragonturtle.logฉันมีกระบวนการทำงานที่เขียนออกมาตรฐานและข้อผิดพลาดมาตรฐานไปยังล็อกไฟล์ มีอยู่แล้วเพื่อหมุนไฟล์บันทึกและมีขั้นตอนอย่างต่อเนื่องในการเขียนไปยังไฟล์บันทึกใหม่โดยไม่ต้องฆ่ากระบวนการ? สิ่งที่เกิดขึ้นในปัจจุบัน (กำหนดค่า logrotate ด้านล่าง) กระบวนการเขียนถึง /var/log/dragonturtle.log Logrotate ย้าย/var/log/dragonturtle.logไปที่/var/log/dragonturtle.log.1 กระบวนการเขียนต่อไป /var/log/dragonturtle.log.1 สิ่งที่ฉันต้องการจะเกิดขึ้น: กระบวนการเขียนถึง /var/log/dragonturtle.log บันทึกการคัดลอก/var/log/dragonturtle.logไปยัง/var/log/dragonturtle.log.1 ตัดทอน Logrotate /var/log/dragonturtle.log กระบวนการเขียนต่อไป /var/log/dragonturtle.log /etc/logrotate.d/dragonturtle: /var/log/dragonturtle.log { daily missingok rotate 7 compress delaycompress notifempty create 644 dragonturtle dragonturtle }
16 logs  stdout  logrotate 


1
เอาต์พุตของคำสั่งไม่ได้อยู่ใน stderr หรือ stdout
ฉันพบปัญหานี้แล้วฉันจึงสงสัยว่าจะเป็นไปได้อย่างไร คำสั่งรันแบบมาตรฐาน: # zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 info from server: "Processed 0 Failed 1 Total 1 Seconds spent 0.000017" sent: 1; skipped: 0; total: 1 ตกลงให้ลองรับบรรทัดแรกเท่านั้น: # zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head -1 sent: 1; skipped: 0; total: 1 หัวมาตรฐานล่ะ # zabbix_sender -c …
16 shell  stdout  stderr 

1
vimdiff เพื่อเปรียบเทียบผลลัพธ์แทนไฟล์
ฉันกำลังพยายามเปรียบเทียบเอาต์พุตคำสั่งสองรายการ (ไม่มีไฟล์) vimdiff "$(tail /tmp/cachain.pem)" "$(tail /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem)" ฉันพยายามเล่นด้วยการเปลี่ยนเส้นทางไปป์vim - -cแต่ฉันต้องหายไปบางอย่าง ใครช่วยได้บ้าง
15 vim  stdout  stdin  vimdiff 

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