ดูเฉพาะการตรวจสอบผลลัพธ์ที่มองเห็นได้หรือไม่?


12

ไม่watchเพียง แต่การตรวจสอบการส่งออกมองเห็นได้จากคำสั่งหรือไม่? สมมติว่าฉันอยู่ในไดเรกทอรีที่มีเนื้อหาดังต่อไปนี้:

$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n

ถ้าฉันเรียกใช้watch -g ls -1ฉันคาดหวังว่ามันจะออกหากมีการเพิ่มหรือลบไฟล์ สิ่งที่เกิดขึ้นจริงคือมันจะออกก็ต่อเมื่อไฟล์ดังกล่าวปรากฏในเทอร์มินัลเอาท์พุตของwatch:

$ watch -g ls -1
Every 2.0s: ls -1                   Wed Nov 13 16:35:03 2013

a
b
c
d
e
f

การลบไฟล์mซึ่งไม่สามารถมองเห็นได้เพราะขนาดของเทอร์มินัลของฉันไม่ได้ทำอะไรเลย การลบไฟล์ที่มองเห็นได้ว่าdทำให้เกิดwatchการออกตามที่คาดไว้

-gมีการอธิบายการตั้งค่าสถานะในmanหน้าของฉัน:

   -g, --chgexit
          Exit when the output of command changes.

เกิดอะไรขึ้น? เป็นเรื่องปกติหรือไม่ ฉันจะใช้watchคำสั่งที่มีเอาต์พุตยาวได้อย่างไร? ฉันใช้watch from procps-ng 3.3.4ซึ่งติดตั้งจาก repos Debian


สิ่งที่ไม่-gเลือกที่จะwatchทำอย่างไร ฉันไม่พบมันในรุ่นของฉันwatch
iruvar

@ 1_CR ดูคำถามที่อัปเดตควรทำให้ออกเมื่อมีการเปลี่ยนแปลงผลลัพธ์ มันจะทำงานตามที่โฆษณาไว้เมื่อการเปลี่ยนแปลงปรากฏบนหน้าจอ
terdon

คำตอบ:


10

ผมพบว่าหัวข้อนี้หัวข้อ: bug # 225549: มีนาฬิกาจอภาพ stderr ชุดข้อความนั้นมาจากปี 2008 แต่ดูเหมือนว่ารุ่นเก่าจะไม่รองรับการดูรายการอื่นนอกเหนือจาก STDOUT

ดังนั้นเราจึง จำกัด เพียงแค่ STDOUT สำหรับการมองเห็นมีภาษาจำนวนมากในinfo watchและman watchทำให้ฉันคิดว่าการสังเกต / การสันนิษฐานของคุณถูกต้อง

สิ่งที่สกัดมา

   watch runs command repeatedly, displaying its output (the first screen‐
   full).   This  allows you to watch the program output change over time.
   By default, the program is run every 2 seconds; use -n or --interval to
   specify a different interval.

บิตนี้ด้วย BUGS:

BUGS
       Upon  terminal resize, the screen will not be correctly repainted until
       the next scheduled update.  All --differences highlighting is  lost  on
       that update as well.

ถ้าฉันต้องเดาว่าฉันคิดว่าพวกเขากำลังเก็บบิตที่มองเห็นได้ในบัฟเฟอร์ระหว่างการวิ่งแล้ววิเคราะห์ตัวละครเหล่านั้น

แก้ไข # 1

ฉันแก้จุดบกพร่องนี้เพิ่มเติมโดยใช้straceและคุณสามารถดูwatchการอ่านผลลัพธ์จากlsคำสั่งดังนั้นภายในวางการเปลี่ยนแปลง

ก่อนที่ฉันจะลบmไฟล์

$ strace -o w.log watch -g 'ls -1'
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\nw.lo"..., 4096) = 34
close(3)                                = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
munmap(0x7f4da83af000, 4096)            = 0
wait4(31011, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 31011
rt_sigaction(SIGTSTP, {SIG_IGN, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, 8) = 0
write(1, "\33[H\33[2JEvery 2.0s: ls -1\33[1;140H"..., 119) = 119
rt_sigaction(SIGTSTP, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, NULL, 8) = 0
nanosleep({2, 0}, NULL)                 = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4da839f9d0) = 31014
close(4)                                = 0
fcntl(3, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4da83af000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\nw.lo"..., 4096) = 34
close(3)                                = 0
munmap(0x7f4da83af000, 4096)            = 0
--- SIGCHLD (Child exited) @ 0 (0) ---

หลังจากmไฟล์ถูกลบ

--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigaction(SIGTSTP, {SIG_IGN, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, 8) = 0
poll([{fd=0, events=POLLIN}], 1, 0)     = 0 (Timeout)
poll([{fd=0, events=POLLIN}], 1, 0)     = 0 (Timeout)
write(1, "\33[1;158H8\33[11;163H", 18)  = 18
rt_sigaction(SIGTSTP, {0x7f4da7f81ee0, [], SA_RESTORER|SA_RESTART, 0x7f4da79b94a0}, NULL, 8) = 0
nanosleep({2, 0}, NULL)                 = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3519, ...}) = 0
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4da839f9d0) = 31028
close(4)                                = 0
fcntl(3, F_GETFL)                       = 0 (flags O_RDONLY)
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4da83af000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
read(3, "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nn\nw.log\n", 4096) = 32
close(3)                                = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
munmap(0x7f4da83af000, 4096)            = 0
wait4(31028, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 31028

ใช่มันดูแปลก ๆ มันทำให้ไม่สามารถวิ่งwatch -g foo; echo "Something changed!"ได้ ดูเหมือนว่าข้อผิดพลาดที่ทำให้หมดอำนาจอย่างประหลาดในโปรแกรมที่จัดตั้งขึ้น
terdon

@terdon - Fedora รุ่นเก่าของฉันไม่มี-gสวิตช์ แต่ฉันลองใช้บน Ubuntu และมันก็ทำงานเหมือนเดิม
slm

ตกลงที่แปลกจริงๆ แล้ว ดังนั้นมันจะตรวจสอบและดูการเปลี่ยนแปลงจริง ๆ แล้วมันแค่ไม่ตอบสนองต่อมัน! ข้อผิดพลาดอย่างแน่นอนแล้ว
terdon

2

ฉันคาดว่ามันจะออกหากมีการเพิ่มหรือลบไฟล์

ผมค่อนข้างมั่นใจว่าคุณหลังจากinotify เครื่องมือ

manpage ของฉันสำหรับการดูจากprocps-ngกล่าว

นาฬิการันคำสั่งซ้ำแสดงผลผลิตและข้อผิดพลาดของตน(คน screenfull แรก)


นั่นไม่ใช่สิ่งที่เขาถามเกี่ยวกับเขาพยายามที่จะเข้าใจพฤติกรรมของการอัพเดทที่เกิดขึ้นการแสดงผ่าน STDOUT แต่ไม่สามารถมองเห็นได้ใน terminal b / c เขาปรับขนาดใหม่เพื่อให้เอาต์พุตที่มีการเปลี่ยนแปลงเป็น "ปิด" หน้าจอ" ทุกคนที่ฉันพูดถึงเรื่องนี้ในวันนี้คาดว่าwatchจะทำตัวเหมือนเป็นโอพีและออกจากการเปลี่ยนแปลง
slm

ใช่เราได้พูดไปแล้วเช่นกันฉันได้เน้นข้อความเดียวกันนั้นในคำตอบของฉัน ฉันรู้ว่า Terdon ค่อนข้างดีและในตอนนี้เขาต้องการทราบเหตุผลว่าทำไม
slm

ฉันเห็นด้วยไม่ใช่คำตอบสำหรับคำถามของเขา แต่เป็นวิธีแก้ปัญหาของเขา
jthill

คุณหมายถึงใช้ inotify ใช่ไหม นั่นไม่ใช่สิ่งที่เขาต้องการเขาต้องการทราบว่าทำไมถึงwatchมีพฤติกรรมแบบนี้ เขารู้เรื่องเกี่ยวกับการรู้แจ้ง
slm

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