ฉันจะระงับเอาต์พุต dd ได้อย่างไร


35

ddฉันมีสคริปต์ทุบตีที่สร้างไฟล์โดยใช้ ปัญหาคือ dd ส่งเอาต์พุตจำนวนมากที่ไปยุ่งกับเอาต์พุตของสคริปต์ของฉัน การค้นหารอบ ๆ ฉันพบวิธีแก้ปัญหาแล้ว:

dd if=boot1h of="/dev/r$temp1" >& /dev/null

มีทางเลือกอื่นหรือเปลี่ยนเส้นทางไปสู่/dev/nullทางเดียวหรือไม่?


3
ฉันแพ้ประโยคสุดท้ายของคุณ "สคริปต์ไม่ควรขอสิทธิ์" ดูเหมือนจะไม่มีอะไรเกี่ยวข้องกับการเปลี่ยนเส้นทางไป/dev/null- คุณกำลัง sudoing เพราะddต้องการเข้าถึงการเขียน/dev/r$temp1(ฉันถือว่า) คุณจะต้องทำเช่นนั้นไม่ว่าคุณจะปราบปรามddเอาท์พุทได้อย่างไร การเปลี่ยนเส้นทางไปที่/dev/nullไม่ต้องใช้ root
Michael Mrozek

ฉันเป็นคนงี่เง่า ไม่อนุญาตให้มีการดำเนินการเนื่องจากมีการใช้ / dev / r $ temp1 / ฉันขอโทษจริงๆ ฉันกำลังแก้ไขสคริปต์ที่ไม่ใช่ของฉันและไม่ได้สังเกต ขอโทษจริงๆ.
Dierre

ดังนั้นปัญหาคือผู้ใช้ทั่วไปไม่สามารถเขียนถึง / dev / r $ temp1 หรือ dev / null ได้
jet

ไม่ต้องกังวลกับมัน ฉันแก้ไขมันเล็กน้อยเพื่อลบส่วนที่สับสน
Michael Mrozek

1
หากคุณไม่ได้ใช้ใด ๆ ของคุณสมบัติขั้นสูง DD ของใช้cat, headหรือtailแทน
Gilles 'หยุดชั่วร้าย'

คำตอบ:


16

จากdd(1)หน้าคน:

   status=noxfer
          suppress transfer statistics

ดังนั้น:

dd if=boot1h of="/dev/r$temp1" status=noxfer

สิ่งนี้ยังคงเอาท์พุท

0+1 records in
0+1 records out

ขยะเมื่อddออกดังนั้นการเปลี่ยนเส้นทางไปยังอ่างข้อมูลจริง ๆ เป็นทางเลือกเดียวของคุณ


นั่นคือฉันกลัว
Dierre

ฉันเชื่อว่า status = noxfer อาจเกี่ยวข้องกับสัญญาณ SIGUSR1 ซึ่งปกติจะแสดงสถิติการถ่ายโอน ฉันไม่เต็มใจที่จะทดสอบว่าจริงหรือไม่ที่ฉันกำลังพูด
maxadamo

54

เพิ่มstatus=none:

dd if=boot1h of="/dev/r$temp1" status=none

จากdd (coreutils) 8.21 เอกสาร :

'status=LEVEL'
     Transfer information is normally output to stderr upon receipt of
     the 'INFO' signal or when 'dd' exits.  Specifying LEVEL will adjust
     the amount of information printed, with the last LEVEL specified
     taking precedence.

     'none'
          Do not print any informational or warning messages to stderr.
          Error messages are output as normal.

     'noxfer'
          Do not print the final transfer rate and volume statistics
          that normally make up the last status line.

     'progress'
          Print the transfer rate and volume statistics on stderr, when
          processing each input block.  Statistics are output on a
          single line at most once every second, but updates can be
          delayed when waiting on I/O.

@roaima - เพียงแค่อยากรู้ว่าทำไมการแก้ไขคำพูดจากหน้าคน?
don_crissti

@don_crissti ฉันรู้สึกว่าบริบท (ขาด) ในการดึงเครื่องหมายคำพูดจาก man page หมายความว่าต้องใช้รูปแบบของคำที่แตกต่างกันเล็กน้อย มันยืนอยู่ในหน้าคนมันดี; นี่มันดูแปลก ๆ
roaima

@roaima - เอาล่ะ - อยากรู้อยากเห็น :) - แต่โปรดทราบว่าคุณเชื่อมโยงไปยังinfo page; คำตอบที่เริ่มต้นที่นี่มีคำพูดที่แน่นอนman pageจาก ฉันจะคัดลอก / วางโดยตรงจากinfoหน้าหากmanหน้าไม่ชัดเจน แต่จริงๆขึ้นอยู่กับคุณ ... โอ้ btw ขอบคุณมากสำหรับความคิดเห็นอื่น ๆ ของคุณในคำตอบของฉันที่เกี่ยวข้องกับการเรียงลำดับตามวันในสัปดาห์
don_crissti

@don_crissti ฉันไม่พบหน้าคนออนไลน์ที่มีคำพูด ขอบคุณสำหรับสิ่งนั้น (die.net มีรุ่นเก่ากว่าddโดยไม่ต้องใช้status=)
roaima

3
ดูเหมือนจะไม่มีใน dd (coreutils) 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
ต่อ Lundberg

5

สำหรับการอ้างอิงในอนาคต:

เพื่อไม่ให้ dd output เปลี่ยนเส้นทาง stderr ไปเป็น / dev / null อย่างสมบูรณ์:

dd if=/dev/urandom of=sample.txt bs=5MB count=1 2> /dev/null

สิ่งนี้ใช้ได้ดีถ้าคุณต้องการเวลาประมวลผลโดยใช้คำสั่ง time ใน bash และกำหนดผลลัพธ์ให้กับตัวแปรโดยไม่ได้รับเอาต์พุตใด ๆ ที่ dd สร้างขึ้น

การอ้างอิง: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html


2

สิ่งนี้จะเหมาะกับคุณเมื่อใช้ BASH และ ZSH รุ่นล่าสุด:

dd if=/path/to/file of=/path/to/another_file bs=1M count=1 &> /dev/null

ป.ล. นี่เป็นเพียงตัวอย่างที่ฉันวิ่ง ...


2

ด้วยแอปพลิเคชันหรือคำสั่ง Unix ใด ๆ คุณสามารถระงับเอาต์พุตทั้งหมดด้วย

cmd >/dev/null 2>&1

บิตแรกเปลี่ยนเส้นทางเอาต์พุตมาตรฐาน (หมายเลขหน่วย 1) ไปยัง / dev / null แต่คุณต้องการส่วนที่สองเพื่อยังเปลี่ยนเส้นทางข้อผิดพลาด (หมายเลขหน่วยที่ 2) ไปยังตำแหน่งเดียวกับหมายเลข 1

ใน UNIX, STDIN = 0, STDOUT = 1 และ STDERR = 2



1
อันที่จริงstderrมีอธิบายไฟล์2 (ฉันถือว่า "STDERR = 3" เป็นเพียงการพิมพ์ผิด)
n.st

1
มันไม่พึงปรารถนาที่จะปราบปรามการส่งออกทั้งหมด หากมีข้อผิดพลาดเกิดขึ้นเราต้องการดูข้อความแสดงข้อผิดพลาด
Sam Watkins

cmd 2>logfile.txtดูเหมือนว่าจะดัดแปลงมากขึ้น
TheSola10

0

หากฉันเข้าใจอย่างถูกต้องว่าคุณกำลังพยายามทำอะไรคุณใส่sudoคำสั่งนั้นลงในสคริปต์และคาดว่าสคริปต์จะถามรหัสผ่านของคุณเมื่อมันทำงานที่นั่นหรือไม่ ในกรณีนี้คุณกำลังทำสิ่งต่าง ๆ ด้วยวิธีที่ซับซ้อน

วิธีการแก้ปัญหาการทำความสะอาดคือการเขียนสคริปต์ในทางปกติ (เช่นโดยไม่ต้องsudo) และเรียกใช้เป็นใช้ super เหตุผลที่อยู่เบื้องหลังคือถ้าสคริปต์ต้องการการเข้าถึง superuser จากนั้นให้สิทธิ์การเข้าถึง (ทำไมรอจนกว่าคำสั่งบางอย่าง?) ในสคริปต์เพื่อตรวจสอบว่ามันถูกเรียกใช้ในฐานะ root หรือไม่ทำสิ่งนี้:

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

Nope นั่นคือสิ่งที่ฉันไม่ต้องการทำ ฉันไม่ต้องการให้สคริปต์ทำงานเป็นรูทเท่านั้นเพราะฉันไม่ต้องการให้ dd แสดงผล เช็คของคุณจะถูกต้องหากฉันต้องการให้สคริปต์ทำงานเป็น superuser
Dierre

@dierre ทำไมคุณต้องการsudoตั้งแต่แรก? ผู้ใช้ปกติควรจะสามารถเปลี่ยนสิ่งต่าง ๆ ให้เป็น/dev/nullปกติ
phunehehe

ฉันใช้อูบุนตูและจะดำเนินการให้ฉันไม่ได้รับอนุญาต ... อืมม์ ...
Dierre

ฉันขอโทษ. ฉันไม่ได้สังเกตว่าฉันกำลังสร้างบางสิ่งภายใต้ / dev / สคริปต์ไม่ใช่ของฉันฉันแก้ไขมัน ฉันขอโทษจริงๆ
Dierre

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