คำถามติดแท็ก io-redirection

การเปลี่ยนเส้นทาง I / O ใช้ในการเขียนสคริปต์เชลล์ คุณลักษณะนี้ทำให้ผู้ใช้สามารถใช้เอาต์พุตของคำสั่งและเปลี่ยนทิศทางเป็นอินพุตสำหรับคำสั่งอื่นหรือคำสั่งสามารถรับอินพุตจากไฟล์แทนจากอินพุตสตรีมมาตรฐานหรือจากเทอร์มินัล กระบวนการทั้งหมดช่วยเชื่อมต่อสตรีมข้อมูลในรูปแบบต่างๆ

10
วิธีต่อท้ายหลายบรรทัดในไฟล์
ฉันกำลังเขียนสคริปต์ทุบตีเพื่อค้นหาไฟล์หากไม่มีอยู่ให้สร้างและผนวกกับมัน: Host localhost ForwardAgent yes ดังนั้น"line then new line 'tab' then text"ฉันคิดว่ามันเป็นรูปแบบที่ละเอียดอ่อน ฉันรู้ว่าคุณสามารถทำได้: cat temp.txt >> data.txt แต่มันดูแปลก ๆ ตั้งแต่สองบรรทัด มีวิธีต่อท้ายที่ในรูปแบบนี้หรือไม่: echo "hello" >> greetings.txt

3
ตัวควบคุมและการเปลี่ยนเส้นทางของเชลล์คืออะไร
ฉันมักจะเห็นบทเรียนออนไลน์ที่เชื่อมต่อคำสั่งต่าง ๆ ด้วยสัญลักษณ์ที่แตกต่างกัน ตัวอย่างเช่น: command1 | command2 command1 & command2 command1 || command2 command1 && command2 คนอื่น ๆ ดูเหมือนจะเชื่อมต่อคำสั่งกับไฟล์: command1 > file1 command1 >> file1 สิ่งเหล่านี้คืออะไร พวกเขาเรียกว่าอะไร พวกเขาทำอะไร? มีอะไรอีกบ้าง? Meta หัวข้อเกี่ยวกับคำถามนี้ .

9
วิธีการดูผลลัพธ์ของกระบวนการทำงานในเซสชั่นทุบตีอื่น?
ฉันออกจากสคริปต์ที่ทำงานบนเครื่องระยะไกลจากเมื่อฉันทำงานในท้องถิ่น ฉันสามารถเชื่อมต่อผ่าน SSH psกับเครื่องเป็นผู้ใช้เดียวกันและดูสคริปต์ที่ทำงานอยู่ใน $ ps aux | grep ipcheck myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh มันเป็นเพียงการส่งออกไปยัง stdout ในเซสชั่นท้องถิ่น (ฉันวิ่งใน./ipchecker.shรูปแบบหน้าต่าง terminal ท้องถิ่นไม่มีการเปลี่ยนเส้นทางไม่มีการใช้งานscreenฯลฯ ) มีต่อไปจากเซสชัน SSH ที่ฉันสามารถดูผลลัพธ์ของคำสั่งที่รันอยู่ (โดยไม่หยุด) จนถึงตอนนี้สิ่งที่ดีที่สุดที่ฉันพบคือใช้strace -p 18386แต่ฉันได้รับข้อความจำนวนมากลอยขึ้นมาบนหน้าจอซึ่งมีรายละเอียดมากเกินไป ฉันสามารถหยุดstraceและจากนั้นร่อนผ่านเอาท์พุทและค้นหาข้อความที่นำมาพิมพ์ไปยัง stdout แต่มันยาวและสับสนและเห็นได้ชัดว่าในขณะที่มันหยุดฉันอาจพลาดบางอย่าง ฉันต้องการหาวิธีที่จะเห็นเอาต์พุตสคริปต์ทำงานเสมือนว่าฉันทำงานในพื้นที่ ใครสามารถปรับปรุงสิ่งนี้ได้บ้าง คำตอบที่ชัดเจนคือการรีสตาร์ทสคริปต์ด้วยการเปลี่ยนเส้นทางหรือในscreenเซสชั่น ฯลฯ นี่ไม่ใช่สคริปต์ที่สำคัญต่อภารกิจดังนั้นฉันสามารถทำได้ แต่ฉันเห็นว่านี่เป็นแบบฝึกหัดการเรียนรู้ที่สนุกสนาน


8
ฉันจะส่ง stdout ไปยังหลายคำสั่งได้อย่างไร
มีคำสั่งบางตัวที่กรองหรือดำเนินการกับอินพุตจากนั้นส่งผ่านไปตามเอาต์พุตฉันคิดว่าปกติแล้วstdout- แต่คำสั่งบางอย่างจะใช้stdinและทำสิ่งที่พวกเขาทำกับมัน ฉันคุ้นเคยกับ OS X มากที่สุดและมีอยู่สองอย่างที่นึกขึ้นมาทันทีpbcopyและpbpaste- ซึ่งหมายถึงการเข้าถึงคลิปบอร์ดของระบบ อย่างไรก็ตามฉันรู้ว่าถ้าฉันต้องการ stdout และคายเอาท์พุทเพื่อไปที่ทั้งสองstdoutและไฟล์จากนั้นฉันสามารถใช้teeคำสั่ง และฉันรู้เรื่องเล็กน้อยxargsแต่ฉันไม่คิดว่านั่นคือสิ่งที่ฉันกำลังมองหา ฉันต้องการทราบว่าฉันสามารถแยกstdoutคำสั่งระหว่างสองคำสั่ง (หรือมากกว่า) ได้อย่างไร ตัวอย่างเช่น: cat file.txt | stdout-split -c1 pbcopy -c2 grep -i errors อาจมีตัวอย่างที่ดีกว่าตัวอย่างนั้น แต่ฉันสนใจที่จะรู้ว่าฉันสามารถส่ง stdout ไปยังคำสั่งที่ไม่ส่งสัญญาณได้อย่างไรและในขณะที่ไม่stdoutถูก "ปิดเสียง" - ฉันไม่ได้ถามเกี่ยวกับcatไฟล์และgrepส่วนหนึ่งของมันและคัดลอกไปยังคลิปบอร์ด - คำสั่งเฉพาะนั้นไม่สำคัญ นอกจากนี้ - ฉันไม่ได้ถามว่าจะส่งไฟล์นี้ไปยังไฟล์ได้อย่างไรstdout- อาจเป็นคำถามที่ "ซ้ำกัน" (ขออภัย) แต่ฉันได้ลองดูแล้วจะพบคนที่คล้ายกันที่ถามถึงวิธีการแยกระหว่าง stdout และไฟล์ - และคำตอบสำหรับคำถามเหล่านั้นดูเหมือนจะเป็นteeซึ่งฉันไม่คิดว่าจะทำงานให้ฉันได้ สุดท้ายคุณอาจถามว่า "ทำไมไม่ทำให้ pbcopy เป็นสิ่งสุดท้ายในห่วงโซ่ท่อ" และการตอบสนองของฉันคือ …

2
ดู stdout / stderr ของบริการ systemd
ฉันสร้างไฟล์เซอร์วิส systemd อย่างง่ายสำหรับแอปพลิเคชันที่กำหนดเอง แอปพลิเคชั่นทำงานได้ดีเมื่อฉันเรียกใช้ด้วยตนเอง แต่ CPU ของฉันเต็มเมื่อใช้งานกับ systemd ฉันพยายามติดตามว่าปัญหาของฉันอยู่ที่ไหน แต่ฉันไม่รู้ว่าจะหาผลลัพธ์ได้จากที่ไหน นี่คือไฟล์บริการของฉัน: [Unit] Description=Syncs files with a server when they change Wants=network.target After=network.target [Service] ExecStart=/usr/local/bin/filesync-client --port 2500 WorkingDirectory=/usr/local/lib/node_modules/filesync-client Restart=always [Install] WantedBy=multi-user.target ตลอดทั้งแอปพลิเคชันฉันส่งออกไปยัง stdout และ stderr ฉันจะอ่านผลลัพธ์ของภูตของฉันได้อย่างไร แก้ไข: ฉันพบman systemd.execซึ่งกล่าวถึงStandardOutput=ตัวเลือก แต่ฉันไม่แน่ใจว่าจะใช้งานอย่างไร จากหน้าคน : StandardOutput= ควบคุมว่า file descriptor 1 (STDOUT) ของกระบวนการที่ดำเนินการเชื่อมต่ออยู่ ใช้เวลาหนึ่งของมรดก , …

1
Bash:“> |” ทำอะไร
ฉันเพิ่งเห็นสิ่งนี้ถูกเขียนลงไป; $ some-command >| /tmp/output.txt ไปป์แนวตั้งถูกใช้ในการเปลี่ยนเส้นทางมาตรฐาน "piping" เอาต์พุตของคำสั่งหนึ่งไปยังอีกคำสั่ง>|ในความเป็นจริงแล้วมันไร้ประโยชน์อย่างสมบูรณ์เพราะมันจะเหมือนกับ>ในสถานการณ์นี้ใช่ไหม?

7
วิธีการเปลี่ยนเส้นทางการส่งออกของ wget เป็นอินพุตเพื่อคลายซิป?
ฉันต้องดาวน์โหลดไฟล์จากลิงค์นี้ การดาวน์โหลดไฟล์เป็นไฟล์ zip ซึ่งฉันจะต้องทำการแตกไฟล์ในโฟลเดอร์ปัจจุบัน โดยปกติฉันจะดาวน์โหลดก่อนแล้วจึงเรียกใช้คำสั่ง unzip $ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip $ unzip temp.zip แต่ในทางนี้ฉันต้องการที่จะดำเนินการทั้งสองคำสั่งรอให้เสร็จสิ้นการคนแรกที่จะดำเนินการอย่างใดอย่างหนึ่งต่อไปยังที่ฉันจะต้องรู้ว่าชื่อของไฟล์ที่จะให้มันไปtemp.zipunzip มันเป็นไปได้ที่จะเปลี่ยนเส้นทางการส่งออกของwgetไปunzip? สิ่งที่ต้องการ $ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834` แต่มันไม่ทำงาน bash:: การwget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zipเปลี่ยนเส้นทางที่ไม่ชัดเจน นอกจากนี้ยังwgetได้ดำเนินการสองครั้งและดาวน์โหลดไฟล์สองครั้ง

7
การเปลี่ยนเส้นทาง stdout ไปยังไฟล์ที่คุณไม่ได้รับอนุญาตให้เขียน
เมื่อคุณพยายามแก้ไขไฟล์โดยไม่ได้รับอนุญาตให้เขียนคุณจะได้รับข้อผิดพลาด: > touch /tmp/foo && sudo chown root /tmp/foo > echo test > /tmp/foo zsh: permission denied: /tmp/foo Sudoing ไม่ได้ช่วยเพราะมันรันคำสั่งในฐานะ root แต่เชลล์จัดการการเปลี่ยนเส้นทาง stdout และเปิดไฟล์เหมือนคุณ > sudo echo test > /tmp/foo zsh: permission denied: /tmp/foo มีวิธีง่าย ๆ ในการเปลี่ยนเส้นทาง stdout ไปยังไฟล์ที่คุณไม่ได้รับอนุญาตให้เขียนนอกจากเปิดเชลล์เป็นรูทและจัดการไฟล์ด้วยวิธีนี้หรือไม่? > sudo su # echo test > /tmp/foo

1
มีวิธีการเปลี่ยนเส้นทางการส่งออก nohup ไปยังไฟล์บันทึกอื่นที่ไม่ใช่ nohup.out หรือไม่?
ฉันใช้โปรแกรมเป็นประจำnohupเพื่อให้กระบวนการของฉันไม่ติดแฮงค์ ดังนั้นหากฉันต้องการให้โปรแกรมมีprogramภูมิคุ้มกันต่อการแฮงค์ฉันจะใช้คำสั่ง nohup program & ที่&ทำให้กระบวนการในพื้นหลัง เมื่อเริ่มต้นnohupให้ข้อความแก่ฉัน: nohup: ผนวกเอาต์พุตไปที่ `nohup.out ' มีวิธีการส่งออกไปยังไฟล์อื่นที่ไม่ใช่nohup.out? บ่อยครั้งที่ฉันต้องการเรียกใช้กระบวนการจำนวนมากในไดเรกทอรีเดียวกันโดยใช้nohupแต่ถ้าฉันทำสิ่งนี้ผลลัพธ์ทั้งหมดจะถูกรวมเข้าด้วยกันในnohup.outไฟล์เดียว หน้าคู่มือ (เช่นที่นี่ ) ดูเหมือนจะไม่มีตัวเลือกในการระบุไฟล์บันทึก คุณกรุณายืนยันสิ่งนี้ได้ไหม นอกจากนี้คุณมีความคิดว่าฉันจะแก้ไขปัญหานี้ได้อย่างไร?

2
วิธีการเปลี่ยนเส้นทางการส่งออกไปยังไฟล์จากภายใน cron?
ฉันมีสคริปต์การสำรองข้อมูลที่ฉันจำเป็นต้องใช้ในเวลาใดเวลาของวันเพื่อให้ฉันใช้cronสำหรับงานนี้และจากภายใน cron logfileกำลังยังพยายามที่จะเปลี่ยนเส้นทางการส่งออกของสคริปต์การสำรองข้อมูลไปยัง crontab -e */1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log ในรายการ cron ด้านบนฉันกำลังเปลี่ยนเส้นทางทั้งสองstderr and stdoutไปยังไฟล์บันทึก งาน cron ด้านบนดำเนินการได้ดีตามsyslog และทำงานที่กล่าวถึงในbackup.shไฟล์ แต่ไม่ได้เขียนอะไรลงในไฟล์บันทึก /var/log/syslog Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log) เมื่อฉันเรียกใช้สคริปต์จาก cli มันทำงานได้ตามต้องการและเอาท์พุทจะถูกเขียนลงในล็อกไฟล์ ranveer@ranveer:~$ ./backup.sh &>> backup.log ranveer@ranveer:~$ cat backup.log Fri Oct 19 20:28:01 IST 2012 …

4
อะไรคือความแตกต่างระหว่าง“ ไฟล์ cat | ./binary” และ“ ./binary <file”
ฉันมีไบนารี่ (ที่ฉันแก้ไขไม่ได้) และฉันสามารถทำได้: ./binary &lt; file ฉันยังสามารถทำได้: ./binary &lt;&lt; EOF &gt; "line 1 of file" &gt; "line 2 of file" ... &gt; "last line of file" &gt; EOF แต่ cat file | ./binary ทำให้ฉันมีข้อผิดพลาด ฉันไม่รู้ว่าทำไมมันไม่ทำงานกับไปป์ ในทั้ง 3 กรณีเนื้อหาของไฟล์ถูกกำหนดให้กับอินพุตมาตรฐานของไบนารี (ในวิธีที่ต่างกัน): bash อ่านไฟล์และมอบ stdin ของไบนารี่ bash อ่านบรรทัดจาก stdin (จนกระทั่ง EOF) และมอบให้ stdin …

5
กระบวนการทดแทนและท่อ
ฉันสงสัยว่าจะเข้าใจสิ่งต่อไปนี้อย่างไร: การวาง stdout ของคำสั่งลงใน stdin ของอีกอันเป็นเทคนิคที่ทรงพลัง แต่ถ้าคุณต้องการไพพ์ stdout ของหลายคำสั่งล่ะ? นี่คือที่มาทดแทนกระบวนการ กล่าวอีกนัยหนึ่งกระบวนการทดแทนสามารถทำสิ่งที่ท่อสามารถทำได้หรือไม่ กระบวนการทดแทนสามารถทำอะไรได้บ้าง แต่ไปป์ไม่ได้


6
ฉันจะสร้างไดเร็กตอรี่ / dev / null ที่คล้ายกันได้อย่างไร?
ฉันต้องการสร้าง/dev/nullไดเรกทอรี "" (หรือไดเรกทอรี "blackhole") เพื่อให้ไฟล์ใด ๆ ที่เขียนลงไปนั้นไม่ได้ถูกเขียนขึ้นจริงๆ แต่เพิ่งหายไป ฉันมีแอปพลิเคชันที่เขียนไฟล์ชั่วคราวขนาดใหญ่ไปยังไดเรกทอรี ฉันไม่สามารถควบคุมชื่อไฟล์และฉันไม่สนใจเนื้อหาของไฟล์เหล่านี้จริงๆ ฉันสามารถเขียนสคริปต์ที่อุดตันไฟล์เหล่านี้เป็นระยะ แต่ไฟล์นั้นเขียนออกมาอย่างรวดเร็วและเติมดิสก์ของฉัน ฉันกำลังมองหาบางสิ่งที่ฉลาดกว่า ฉันต้องการให้แอปพลิเคชัน "คิด" ว่ามันกำลังเขียนไฟล์เหล่านี้ แต่ในความเป็นจริงการเขียนจะถูกยกเลิกไปที่ส่วนอื่น ๆ ดูหัวข้อนี้ที่เกี่ยวข้องเก่า

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