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

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

9
จะไม่ทำสิ่งใดตลอดไปอย่างสง่างาม?
ผมมีโปรแกรมที่ก่อให้ข้อมูลที่เป็นประโยชน์ในแต่ยังอ่านจากstdout stdinฉันต้องการเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์โดยไม่ต้องให้อะไรกับอินพุตมาตรฐาน จนถึงตอนนี้ดีมาก: ฉันทำได้: program > output และไม่ทำอะไรเลยใน tty อย่างไรก็ตามปัญหาคือฉันต้องการทำในพื้นหลัง ถ้าฉันทำ: program > output & โปรแกรมจะถูกระงับ ("ถูกระงับ (อินพุต tty)") ถ้าฉันทำ: program < /dev/null > output & โปรแกรมหยุดทำงานทันทีเนื่องจากถึง EOF ดูเหมือนว่าสิ่งที่ฉันต้องการก็คือการเข้าไปในท่อสิ่งที่ไม่ได้ทำอะไรสำหรับจำนวนเงินที่แน่นอนของเวลาและไม่ได้อ่านprogram stdinแนวทางต่อไปนี้ใช้ได้ผล: while true; do sleep 100; done | program > output & mkfifo fifo && cat fifo | program > output …

6
ฉันสามารถไปป์ stdout บนเซิร์ฟเวอร์หนึ่งเพื่อ stdin บนเซิร์ฟเวอร์อื่นได้หรือไม่
stdoutบนเซิร์ฟเวอร์ CentOS หนึ่งเซิร์ฟเวอร์ต้องถูกไพพ์ไปstdinยังเซิร์ฟเวอร์ CentOS อื่น เป็นไปได้ไหม ปรับปรุง ScottPack, MikeyB และ jofel ล้วนมีคำตอบที่ถูกต้อง ฉันได้รับคำตอบให้กับสกอตต์เพราะแม้ว่าคำถามของฉันไม่ได้ระบุความปลอดภัยเป็นข้อกำหนด แต่ก็ดีที่จะปลอดภัย อย่างไรก็ตามคำแนะนำของเพื่อนอีกสองคนนั้นก็ใช้ได้เช่นกัน
74 pipe  stdout  stdin 

2
การส่งข้อมูลไปยัง stdin ของกระบวนการโดยไม่ทำให้ EOF เกิดขึ้นภายหลัง
ฉันมีไฟล์ปฏิบัติการที่เริ่มต้นเชลล์แบบโต้ตอบกับผู้ใช้ เมื่อต้องการเปิดตัวเชลล์ให้ฉีดคำสั่งสองสามคำก่อนจากนั้นอนุญาตให้ผู้ใช้มีเซสชันแบบโต้ตอบ ฉันสามารถทำได้อย่างง่ายดายโดยใช้echo: echo "command 1\ncommand 2\ncommand3" | ./shell_executable นี้เกือบจะทำงาน ปัญหาคือคำสั่ง echo ที่ป้อน stdin ของกระบวนการจะกระทบ EOF เมื่อดำเนินการตามคำสั่งของฉันแล้ว EOF นี้ทำให้เชลล์ยกเลิกทันที (ราวกับว่าคุณกด Ctrl + D ในเชลล์) มีวิธีฉีดคำสั่งเหล่านี้ลงใน stdin โดยไม่ทำให้ EOF ภายหลังได้หรือไม่

4
“ openssl dgst -sha1” สร้างสิ่งที่ไม่เกี่ยวข้อง“ (stdin) =” คำนำหน้าและขึ้นบรรทัดใหม่
หากคุณรันคำสั่งนี้บน Unix ของคุณ echo -n "foo" | openssl dgst -sha1 คุณจะได้รับผลลัพธ์นี้: (stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33 (ตามด้วยการขึ้นบรรทัดใหม่) ฉันจะบังคับให้ openssl ไม่แสดง(stdin)=คำนำหน้าและหลีกเลี่ยงการขึ้นบรรทัดใหม่ได้อย่างไร
31 openssl  stdin 

6
ฉันจะทำให้โปรแกรมหลามทำงานอย่างไรเช่นเครื่องมือยูนิกซ์ที่เหมาะสม?
ฉันมีสคริปต์ Python อยู่สองสามตัวและฉันก็กำลังเขียนมันใหม่ ฉันมีปัญหาเดียวกันกับพวกเขาทั้งหมด ฉันไม่เห็นได้ชัดว่าจะเขียนโปรแกรมอย่างไรเพื่อให้พวกเขาทำตัวเหมือนเครื่องมือยูนิกซ์ที่เหมาะสม เพราะสิ่งนี้ $ cat characters | progname และนี่ $ progname characters ควรสร้างผลลัพธ์เดียวกัน สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถพบได้ใน Python คือไลบรารี fileinput น่าเสียดายที่ฉันไม่เห็นวิธีเขียนสคริปต์ Python ของฉันอีกครั้งซึ่งทั้งหมดมีลักษณะดังนี้: #!/usr/bin/env python # coding=UTF-8 import sys, re for file in sys.argv[1:]: f = open(file) fs = f.read() regexnl = re.compile('[^\s\w.,?!:;-]') rstuff = regexnl.sub('', fs) f.close() print rstuff …

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 

3
วิธีการส่งรหัสผ่านไปยังบรรทัดคำสั่ง mysql
ฉันมีรหัสผ่าน MySQL บันทึกไว้ในไฟล์foo.phpเช่นP455w0rdเมื่อฉันพยายามใช้: $ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver Enter password: (holds) $ echo P455w0rd | mysql -u root -p mydb -h friendserver Enter password: (holds) ตัวเลือกทั้งสองยังคงถามรหัสผ่านวิธีการที่ถูกต้องในการส่งรหัสผ่านstdinคืออะไร?
20 password  mysql  stdin 

3
nohup: ละเว้นอินพุตและเปลี่ยนทิศทาง stderr ไปที่ stdout
ฉันเริ่มต้นแอปพลิเคชันของฉันในพื้นหลังโดยใช้nohupตามที่ระบุไว้ด้านล่าง - root@phx5qa01c:/bezook# nohup java -jar ./exhibitor-1.5.1/lib/exhibitor-1.5.1-jar-with-dependencies.jar -c file --fsconfigdir /opt/exhibitor/conf --hostname phx5qa01c.phx.qa.host.com > exhibitor.out & [1] 30781 root@phx5qa01c:/bezook# nohup: ignoring input and redirecting stderr to stdout แต่ทุกครั้งที่ฉันเห็นข้อความนี้ - nohup: ignoring input and redirecting stderr to stdout จะมีปัญหาใด ๆ หรือไม่หากฉันเห็นข้อความนี้ มันหมายถึงอะไรและฉันจะหลีกเลี่ยงได้อย่างไร

4
ทำไมบางคำสั่งไม่อ่านจากอินพุตมาตรฐาน?
ฉันสงสัยว่าเมื่อไหร่ที่เราควรใช้ไปป์ไลน์และเมื่อใดที่เราไม่ควรทำ พูดเช่นเพื่อฆ่ากระบวนการบางอย่างที่จัดการไฟล์ pdf ข้อมูลต่อไปนี้จะไม่ทำงานโดยใช้ไปป์ไลน์: ps aux | grep pdf | awk '{print $2}'|kill แต่เราสามารถทำได้ด้วยวิธีต่อไปนี้เท่านั้น: kill $(ps aux| grep pdf| awk '{print $2}') หรือ ps aux | grep pdf | awk '{print $2}'| xargs kill อ้างอิงจากman bash(เวอร์ชั่น4.1.2): The standard output of command is connected via a pipe to the standard input …
19 shell  pipe  arguments  stdin 

4
สร้างไฟล์เสมือนจริงที่เป็นคำสั่ง
มีวิธีการสร้างไฟล์เสมือนเช่นอ่านจากไฟล์จริงอ่านจากstdoutคำสั่งของ; การเขียนไปยังไฟล์เป็นการเขียนไปยังstdinคำสั่งหรือไม่ จนถึงตอนนี้ฉันได้ตัดมันด้วยinotifywaitไฟล์บนซึ่งเรียกคำสั่งเมื่อไฟล์ถูกแก้ไขโดยนำข้อมูลจากไฟล์และเขียนกลับไป ฉันไม่ชอบที่inotifywaitจะต้องเริ่มต้นใหม่อย่างต่อเนื่องแม้ว่า (และฉันต้องให้แน่ใจว่ามันจะทำงานอยู่เสมอ) ฉันใช้ไฟล์นี้แค่สองครั้งต่อสัปดาห์
18 files  stdin 

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
จะ“ หัก” ไฟล์ชื่อ“ -” ได้อย่างไร?
ฉันสร้างไฟล์โดยใช้ชื่อ-(เช่นseq 10 > -) โดยไม่ตั้งใจ จากนั้นฉันก็ลองใช้lessดู แต่มันก็แค่แฮงค์ ฉันเข้าใจว่าสิ่งนี้เกิดขึ้นเพราะless -คาดว่าจะป้อนข้อมูลจากstdinดังนั้นจึงไม่ตีความ-ว่าเป็นชื่อไฟล์ ฉันพยายามless \-แต่มันก็ไม่ทำงานเหมือนกัน ดังนั้นมีวิธีใดบ้างที่ระบุlessว่า-เป็นไฟล์ไม่ใช่ stdin? สิ่งที่ดีที่สุดที่ฉันจะได้รับคือ: find -name '-' -exec less {} +
17 less  stdin 

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

1
ทำให้โปรแกรมอ่านเป็นครั้งแรกจากไปป์แล้วจากคีย์บอร์ด
interactiveพิจารณาโปรแกรมโต้ตอบ ฉันต้องเรียกใช้โปรแกรมนี้บ่อยครั้งและทุกครั้งที่ฉันเรียกใช้คำสั่งแรก ๆ นั้นเหมือนกัน เห็นได้ชัดว่าการพิมพ์คำสั่งเหล่านั้นซ้ำแล้วซ้ำอีกเป็นความเจ็บปวด ฉันได้เก็บคำสั่งเหล่านั้น (คั่นด้วยการขึ้นบรรทัดใหม่) cmdในแฟ้ม ตอนนี้ฉันสามารถทำได้cat cmd | interactiveเพื่อเรียกใช้คำสั่ง ปัญหาคือเมื่อcmdอ่านเสร็จแล้วจะinteractiveได้รับ EOF และออก สิ่งที่ฉันต้องการทำคือinteractiveอ่านจากไปป์ก่อน (เห็นได้ชัดว่าinteractive < cmdยอมรับได้) และเมื่อได้รับ EOF ให้เริ่มอ่านจากแป้นพิมพ์แทน
17 command-line  pipe  cat  stdin 

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