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

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

2
ฉันจะกำหนดเอาต์พุตของคำสั่งให้กับตัวแปร shell ได้อย่างไร?
ฉันต้องการกำหนดผลลัพธ์ของนิพจน์ให้กับตัวแปรและเชื่อมโยงกับสตริงแล้วสะท้อนกลับ นี่คือสิ่งที่ฉันได้รับ: #!/bin/bash cd ~/Desktop; thefile= ls -t -U | grep -m 1 "Screen Shot"; echo "Most recent screenshot is: "$thefile; แต่ผลลัพธ์นั้น: Screen Shot 2011-07-03 at 1.55.43 PM.png Most recent screenshot is: ดังนั้นดูเหมือนว่าจะไม่ได้รับมอบหมาย$thefileและกำลังถูกพิมพ์ขณะดำเนินการ

10
วิธี grep สตรีมข้อผิดพลาดมาตรฐาน (stderr)?
ฉันใช้ ffmpeg เพื่อรับข้อมูลเมตาของคลิปเสียง แต่ฉันไม่สามารถ grep มัน $ ffmpeg -i 01-Daemon.mp3 |grep -i Duration FFmpeg version SVN-r15261, Copyright (c) 2000-2008 Fabrice Bellard, et al. configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib --mandir=/usr/share/man --arch=i386 --extra-cflags=-O2 ... ฉันตรวจสอบเอาต์พุต ffmpeg นี้โดยตรงไปที่ stderr $ ffmpeg -i 01-Daemon.mp3 2> /dev/null ดังนั้นฉันคิดว่า grep ไม่สามารถอ่านสตรีมข้อผิดพลาดเพื่อตรวจจับเส้นที่ตรงกันได้ เราจะเปิดใช้งาน grep เพื่ออ่านสตรีมข้อผิดพลาดได้อย่างไร? การใช้ลิงก์nixCraftฉันเปลี่ยนเส้นทางสตรีมข้อผิดพลาดมาตรฐานไปยังสตรีมเอาต์พุตมาตรฐานจากนั้น …

6
การใช้ while loop เพื่อ ssh ไปยังเซิร์ฟเวอร์หลายเครื่อง
ฉันมีไฟล์servers.txtพร้อมรายการเซิร์ฟเวอร์: server1.mydomain.com server2.mydomain.com server3.mydomain.com เมื่อฉันอ่านไฟล์ทีละบรรทัดด้วยwhileและสะท้อนแต่ละบรรทัดทำงานได้ตามที่คาดหวัง พิมพ์ทุกบรรทัด $ while read HOST ; do echo $HOST ; done < servers.txt server1.mydomain.com server2.mydomain.com server3.mydomain.com อย่างไรก็ตามเมื่อฉันต้องการ ssh ไปยังเซิร์ฟเวอร์ทั้งหมดและรันคำสั่งทันใดนั้นwhileลูปของฉันก็หยุดทำงาน: $ while read HOST ; do ssh $HOST "uname -a" ; done < servers.txt Linux server1 2.6.30.4-1 #1 SMP Wed Aug 12 19:55:12 EDT 2009 i686 …

7
คุณจะใช้ตัวอธิบายไฟล์เพิ่มเติมเมื่อใด
ฉันรู้ว่าคุณสามารถสร้างไฟล์ descriptor และเปลี่ยนเส้นทางไปยังมัน เช่น exec 3<> /tmp/foo # open fd 3. echo a >&3 # write to it exec 3>&- # close fd 3. แต่คุณสามารถทำสิ่งเดียวกันโดยไม่มีไฟล์ descriptor: FILE=/tmp/foo echo a > "$FILE" ฉันกำลังมองหาตัวอย่างที่ดีเมื่อคุณจะต้องใช้ตัวอธิบายไฟล์เพิ่มเติม

4
ฉันจะปิดเสียง cronjob ให้เป็น / dev / null / ได้อย่างไร
บน Ubuntu-Desktop และบนเดเบียนเซิร์ฟเวอร์ของฉันฉันมีสคริปต์ที่ต้องดำเนินการทุกนาที (สคริปต์ที่เรียกนาทีของการเรียกดูออนไลน์ในพื้นที่ของฉัน) ปัญหาคือว่าใน debian derivates cron จะเข้าสู่ระบบ/var/log/syslogทุกครั้งที่ดำเนินการ ฉันเห็นข้อความที่ถูกประหารซ้ำแล้วซ้ำอีกใน/var/log/syslog: Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1) ฉันรู้ว่าเพื่อที่จะระงับการส่งออกของโปรแกรมฉันสามารถเปลี่ยนเส้นทางไปยัง/dev/nullเช่นซ่อนข้อผิดพลาดและข้อความเตือนจากโปรแกรมฉันสามารถสร้างบรรทัดใน crontab เช่นนี้ * * * * * root /usr/local/sbin/mycommand.sh > /dev/null แต่ฉันต้องการเรียกใช้ cronjob และตรวจสอบว่าเอาต์พุตหรือข้อผิดพลาดที่สร้างขึ้นทั้งหมดถูกไพพ์ไปที่ NULL ดังนั้นจึงไม่สร้างข้อความใด ๆ ใน syslog และไม่สร้างอีเมลใด ๆ แก้ไข: มีวิธีแก้ปัญหาในการเปลี่ยนเส้นทางบันทึก cron เป็นบันทึกแยกต่างหากเช่นเสนอที่นี่โดยการเปลี่ยน/etc/syslog.conf แต่ข้อเสียเปรียบก็คือว่าผลลัพธ์ทั้งหมดของ …

8
ฉันจะทำให้ iconv แทนที่ไฟล์อินพุตด้วยเอาต์พุตที่ถูกแปลงได้อย่างไร?
ฉันมีสคริปต์ทุบตีซึ่งระบุผ่านทุกไฟล์ * .php ในไดเรกทอรีและนำiconvไปใช้กับมัน สิ่งนี้ได้รับผลลัพธ์ใน STDOUT เนื่องจากการเพิ่ม-oพารามิเตอร์ (จากประสบการณ์ของฉัน) จริง ๆ แล้วเขียนไฟล์เปล่าก่อนที่จะเกิดการแปลงฉันจะปรับสคริปต์ของฉันเพื่อให้เกิดการแปลงจากนั้นจึงเขียนทับไฟล์อินพุต for file in *.php do iconv -f cp1251 -t utf8 "$file" done


1
เปลี่ยนเส้นทางทั้ง stderr และ stdout เป็น / dev / null ด้วย / bin / sh
ฉันได้ลองทุกวิธีเพื่อเปลี่ยนเส้นทางทั้งไปstdoutและไม่ประสบความสำเร็จ ผมมีเกือบทั้งทุบตีชีวิตการทำงานของฉันที่ฉันไม่เคยมีปัญหานี้ด้วย แต่เป็นครั้งแรกใน BSD ฉันติดอยู่กับstderr/dev/null/bin/sh สิ่งที่ฉันได้ลอง: if ls ./python* 2> /dev/null; then echo found Python fi ... ซึ่งใช้งานได้; ถ้า Python ไม่มีอยู่มันจะปิดข้อความแสดงข้อผิดพลาดจาก ls อย่างไรก็ตามถ้าpython.tgzมีอยู่บรรทัดที่มีเอาต์พุตซึ่งมีลักษณะดังนี้: # ./test.sh ./python-2.7.3p1.tgz ฉันได้ลองแล้ว: if ls ./python* &> /dev/null; then echo found Python fi และ if ls ./python* 2>1 > /dev/null; then echo found Python fi และ …

1
คำสั่งนี้ถูกกฎหมายอย่างไร “> file1 <file2 cat”
สมมติว่าfile2มีอยู่แล้วคำสั่ง &gt; file1 &lt; file2 cat ดูเหมือนจะคัดลอกเนื้อหาของการfile2file1 แต่ฉันไม่เข้าใจโครงสร้างนี้ ฉันเข้าใจว่า "ไม่มีสิ่งใด" กำลังถูกนำไปสู่file1(สร้างหรือลบเนื้อหา) แล้วเนื้อหาของจะถูกนำไปยังfile2file1 เป็นเพราะเหตุใดcatหลังจากที่file2? จะทราบได้อย่างไรcat file2ว่าตัวถูกดำเนินการไม่ได้อยู่ในลำดับที่ถูกต้อง?

5
วิธีการเรียกใช้คำสั่งที่เกี่ยวข้องกับการเปลี่ยนเส้นทางหรือท่อด้วย sudo?
ฉันกำลังพยายามติดตามสิ่งที่ฉันถือว่าเป็นแนวทางปฏิบัติที่ดีที่สุดในการใช้ sudo แทนบัญชีรูท ฉันกำลังใช้งานไฟล์ concat อย่างง่ายเช่น: sudo echo 'clock_hctosys="YES"' &gt;&gt; /etc/conf.d/hwclock สิ่งนี้ล้มเหลวทางด้านขวาของ "&gt;&gt;" ซึ่งกำลังทำงานในฐานะผู้ใช้ปกติ การเพิ่ม sudos พิเศษก็ล้มเหลวเช่นกัน (ลักษณะการทำงานที่คาดไว้ตั้งแต่การไพพ์ไปยังคำสั่ง sudo และไม่ไปที่ไฟล์) ตัวอย่างเป็นเพียงแค่นั้น แต่มันได้รับการตรวจสอบและทดสอบภายใต้บัญชีรูท

2
คุณจะใช้การเปลี่ยนเส้นทางผลลัพธ์ร่วมกับ here-เอกสารและ cat ได้อย่างไร
สมมติว่าฉันมีสคริปต์ที่ฉันต้องการไพพ์ไปยังคำสั่งอื่นหรือเปลี่ยนเส้นทางไปยังไฟล์ (ไพพ์shสำหรับตัวอย่าง) สมมติว่าฉันใช้ทุบตี ฉันสามารถทำได้โดยใช้echo: echo "touch somefile echo foo &gt; somefile" | sh ฉันสามารถทำสิ่งเดียวกันได้โดยใช้cat: cat &lt;&lt; EOF touch somefile echo foo &gt; somefile EOF แต่ถ้าฉันแทนที่ "EOF" ด้วย "EOF | sh" แค่คิดว่ามันเป็นส่วนหนึ่งของ heredoc ฉันจะสร้างมันขึ้นมาเพื่อให้catส่งออกข้อความจาก stdin แล้วไปป์ที่ตำแหน่งใด ๆ ?


3
การปิดไฟล์ descriptor,> & - vs <& -
ในการกวดวิชาทุบตีฉันอ่านมันบอกว่าถ้าคุณเปิดไฟล์อธิบายสำหรับการอ่านคือ exec 3&lt; echolist จากนั้นคุณต้องปิดมันแบบนี้ exec 3&lt;&amp;- อย่างไรก็ตามหากคุณเปิดไฟล์ descriptor เพื่อทำการเขียนจะต้องปิดดังนี้: exec 3&gt;&amp;- แต่เมื่อฉันดูบนอินเทอร์เน็ตฉันเห็นผู้คนกำลังเปิดไฟล์แล้วปิดด้วย: exec 3&gt;&amp;- หมายเหตุ:exec 3&lt;&amp;1เมื่อตามกวดวิชาที่พวกเขาควรจะใช้ ดังนั้นคำถามของฉันคือตัวอธิบายไฟล์ทั้งหมดสามารถปิดได้โดยexec n&gt;&amp;-ที่ n คือหมายเลขตัวอธิบายไฟล์หรือไม่ ไม่ว่าจะเปิดอ่านหนังสือเขียนหรือทั้งสองอย่าง

5
โปรแกรมบรรทัดคำสั่งสามารถป้องกันไม่ให้มีการเปลี่ยนเส้นทางเอาต์พุตได้หรือไม่?
ฉันคุ้นเคยกับการทำสิ่งนี้: someprogram &gt;output.file ฉันทำเมื่อใดก็ตามที่ฉันต้องการบันทึกผลลัพธ์ที่โปรแกรมสร้างลงในไฟล์ ฉันยังรับรู้ถึงสองตัวแปรของการเปลี่ยนเส้นทาง IOนี้: someprogram 2&gt;output.of.stderr.file (สำหรับ stderr) someprogram &amp;&gt;output.stderr.and.stdout.file (สำหรับทั้ง stdout + stderr รวมกัน) วันนี้ฉันได้วิ่งข้ามสถานการณ์ที่ฉันไม่คิดว่าเป็นไปได้ ฉันใช้คำสั่งต่อไปนี้xinput test 10และตามที่คาดหวังฉันมีผลลัพธ์ต่อไปนี้: user @ hostname: ~ $ xinput ทดสอบ 10 กดปุ่ม 30 การปลดล็อคกุญแจ 30 กดปุ่ม 40 การปลดล็อคกุญแจ 40 กดปุ่ม 32 การปลดล็อคกุญแจ 32 กดปุ่ม 65 การปลดล็อคกุญแจ 65 กดปุ่ม 61 ปล่อยกุญแจ 61 กดปุ่ม …

11
ฉันจะใช้เอาต์พุตล่าสุดจากบรรทัดรับคำสั่งใหม่ได้อย่างไร
ฉันต้องการทราบวิธีการใช้ผลลัพธ์สุดท้ายจากคอนโซลเช่น: pv-3:method Xavier$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" /Library/Python/2.6/site-packages pv-3:method Xavier$ cd **LASTOUTPUT**

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