คำสั่ง bash watch ที่เก็บสีไว้


57

จากman watch:

อักขระที่ไม่พิมพ์ถูกแยกออกจากผลลัพธ์ของโปรแกรม ใช้ "cat -v" เป็นส่วนหนึ่งของไพพ์ไลน์คำสั่งหากคุณต้องการดู

ดังนั้นฉันจะใช้cat -vอย่างไรถ้าฉันต้องการดูผลลัพธ์สีจาก:

watch ls -al --color

คำตอบ:


63

คำสั่งที่ถูกต้องคือ

watch --color "ls -a1 --color"

มันไม่ได้จัดทำเป็นเอกสารไว้ใน man page หรือหน้าจอ --help ฉันต้องใช้สตริงเพื่อค้นหา


@ PawełGościckiไม่เป็นไรแล้วพบมันด้วยความเลวทรามแม้ว่าจะไม่สามารถทำงานร่วมกับ phpunit ได้
Ikke

1
นาฬิกาของฉันคือ v0.3.0 และฉันใช้ Ubuntu 10.0
PawełGościcki

2
ฉันยังมีรุ่น 0.3.0 และสำหรับ "ls --color" แบบเรียบง่ายคำสั่ง watch จะทำงานได้ แต่ด้วยเหตุผลบางอย่างที่ทำให้สถานการณ์ซับซ้อนไม่ทำ: watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"จะกินสี :(
คณิตศาสตร์

@ คณิตศาสตร์: ลองสลับการเสนอราคาเดี่ยวและคู่ของคุณ
Dennis Williamson

watchจาก procps (เริ่มต้นบนลินุกซ์ distros ส่วนใหญ่ผมเชื่อว่า) มี--colorตัวเลือกตั้งแต่ V3.3.2
sleske

27

ฉันคิดว่าอาจเป็นไปไม่ได้ด้วยคำสั่ง 'watch' นี่เป็นอีกวิธีในการทำ:

while true; do clear; date;echo;ls -al --color; sleep 2; done

คุณสามารถใส่ไว้ในสคริปต์ตัวอย่างเช่น:

echo "while true; do clear; date;echo;\$*;sleep 2; done" > watch2
chmod +x watch2
./watch2 ls -al --color

เพื่อชี้แจงนี่คือเหตุผลที่ฉันคิดว่ามันเป็นไปไม่ได้ด้วยคำสั่ง 'watch' ดูว่าเกิดอะไรขึ้นถ้าคุณใช้ cat -v:

watch "ls -al --color|cat -v"

มันแสดงให้คุณเห็นถึงตัวควบคุมสี ... ซึ่งฉันคิดว่าไม่ใช่สิ่งที่คุณต้องการ


man watchwatchอย่างเห็นได้ชัดให้เห็นว่ามันควรจะเป็นไปโดยไม่ชอบขี้หน้า
PawełGościcki

ไม่ได้บอกว่าคุณจะสามารถดูสีได้ มันบอกว่าคุณจะสามารถดูอักขระที่ไม่สามารถพิมพ์ได้ ลองคำสั่งของฉันตามข้างบนcat -vเพื่อดูว่าman watchกำลังพูดถึงอะไร
davr

1
คุณสามารถลดระยะเวลาของการกะพริบเพียงเล็กน้อยโดย a) การรวบรวมข้อมูลที่จะแสดงเป็นตัวแปร b) การล้างหน้าจอ c) การพิมพ์ตัวแปร
Nick Russo

1
@ NickRusso ขอบคุณสำหรับคำแนะนำ บางสิ่งเช่นนี้จะช่วยลดการกะพริบได้อย่างมาก:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark

1
@KevinMark: echo "$out"คุณควรใช้คำพูดในการจัดการหลายบรรทัด: stackoverflow.com/q/2414150/86967
nobar

6

หากคุณใช้ Mac เช่นฉันwatchจาก Homebrew ไม่รองรับสี

สิ่งที่คุณต้องการคือfswatchแต่ยังไม่เป็น Homebrew หากต้องการติดตั้งคุณจะต้องทำสิ่งที่ซับซ้อนกว่านี้เล็กน้อย

https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3‌​/Library/Formula/fswatch.rb

ดูคำตอบ SO นี้สำหรับการใช้งาน


2
ใช้งานได้กับระบบไฟล์เท่านั้นในขณะที่watchใช้กับคำสั่ง
Brice

fswatch มีให้บริการใน Homebrew 0.9.5
code_monk

1

UPDATE : เปลี่ยนเวอร์ชั่นล่าสุดของการwatchแก้ไขปัญหา ดังนั้นถ้าสีของwatch --colorผิดมันอาจจะดีกว่าที่จะอัพเดทมัน (ในระบบของฉันมันอยู่ในprocpsแพ็คเกจ)


การรองรับสีwatch --colorมี จำกัด ในประสบการณ์ของฉัน (แต่เพียงพอสำหรับls -l --color) นี่คือคำตอบของ @davr รุ่นของฉันพร้อมด้วยคุณสมบัติพิเศษบางอย่างที่สำคัญที่สุดคือลดการสั่นไหว คุณสามารถวางไว้ใน .bashrc cwatch ls -l --colorของคุณและใช้มันเป็น

# `refresh cmd` executes clears the terminal and prints
# the output of `cmd` in it.
function refresh {
  tput clear || exit 2; # Clear screen. Almost same as echo -en '\033[2J';
  bash -ic "$@";
}

# Like watch, but with color
function cwatch {
   while true; do
     CMD="$@";
     # Cache output to prevent flicker. Assigning to variable
     # also removes trailing newline.
     output=`refresh "$CMD"`;
     # Exit if ^C was pressed while command was executing or there was an error.
     exitcode=$?; [ $exitcode -ne 0 ] && exit $exitcode
     printf '%s' "$output";  # Almost the same as echo $output
     sleep 1;
   done;
}

คุณสามารถลองทำสิ่งต่าง ๆ เช่น

cwatch 'ls -l --color | head -n `tput lines`'

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

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.