আমি কীভাবে আমার ওয়াচ কমান্ডের আউটপুটটিতে স্ক্রোল করতে পারি?


38

watchস্ক্রিপ্টটি চালিত হওয়ার সাথে সাথে আমার ডিরেক্টরিতে লিখিত সামগ্রী পরিবর্তন করার জন্য আমি কমান্ডটি ব্যবহার করি (এর মাধ্যমে watch ls dir/)

এটি একটি দুর্দান্ত সরঞ্জাম, কেবলমাত্র এন্ট্রি সংখ্যা স্ক্রিনের উল্লম্ব দৈর্ঘ্য পূরণ করার পরে আমি সমস্ত লিখিত সামগ্রী নীচে বা উপরে স্ক্রোল করে দেখতে পাচ্ছি না।

এই কাজ করতে একটি উপায় আছে কি?



টপলেস রয়েছে তবে এটি কেবল বিএসডি বা আরপিএমের জন্য খুঁজে পাওয়া গেছে, কোনও ডেব প্যাকেজ নেই
অ্যান্টনি গিবস

উত্তর:


31

watchদুর্দান্ত, তবে এটি এটি করতে পারে না এমন একটি জিনিস। আপনি tailসর্বশেষতম এন্ট্রিগুলি দেখানোর জন্য ব্যবহার করতে পারেন :

watch "ls -rtx dir/ | tail -n $(($LINES - 2))"

1
$(($LINES - 2))"সর্বশেষতম এন্ট্রিগুলি কেন ব্যবহার করা প্রয়োজন তা আপনি ব্যাখ্যা করতে পারেন ?
বিবাজা 42

6
@ বিবাজা ৪৪: এটি watchনিজের আউটপুট দেওয়ার জন্য কয়েক লাইন রেখে পর্দাটি পূর্ণ করে। $LINESবাশ এবং অন্যান্য শেলগুলি স্ক্রিনটি প্রদর্শন করতে পারে এমন লাইন সংখ্যা ধারণ করতে একটি স্বয়ংক্রিয় পরিবর্তনশীল। আপনি যে tailকোনও নম্বর চাইবেন
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

লেজটিতে একাধিক প্রোগ্রামের আউটপুট (&& ব্যবহার করে শৃঙ্খলিত) পাইপ দেওয়ার জন্য আমি কি এই আদেশটি ব্যবহার করতে পারি?
T0xicCode

@ xav0989: আপনার আপনার চেইনটি কোঁকড়ানো ধনুর্বন্ধনীতে আবৃত করা দরকার বা এটি কেবল tailসর্বশেষ আদেশ হবে: { command1 && command2 && command3; } | tail- ফাঁকা স্থানগুলি (খোলার পরে এবং বন্ধনী বন্ধ করার আগে) এবং শেষ কমান্ডের পরে সেমিকোলনটি ভুলে যাবেন না। মনে রাখবেন, প্রতিটি চেইন watchএটি পুনরায় চালু করার পরে পুরো চেইন কার্যকর করা হবে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।


2

আমি একটি ব্যাশ ** সোয়াচ ** প্রোগ্রাম তৈরি করেছি যা আপনি ব্যাশে যা চান ঠিক তা করে। জিআইএফ ভিডিওতে আপনি দেখতে পাচ্ছেন কীভাবে পরিবর্তিত মিমিও ফাইলের মাধ্যমে স্ক্রোল করবেন।

এখানে চিত্র বর্ণনা লিখুন

#!/bin/bash
#
# watch a file and scroll 
#
# keys => arrow-up/down, page-up/down, pos1, end
#
# usages:
#           swatch -n <timeout_watch> <file>
#           swatch <file>
#
# version:          1.1
# dependencies:     awk , tput , clear, read
# published:        https://unix.stackexchange.com/questions/3842/how-can-i-scroll-within-the-output-of-my-watch-command
# gif recording:    peek , https://github.com/phw/peek

#
# =============================================
# KEYCODES
# =============================================
# https://unix.stackexchange.com/questions/294908/read-special-keys-in-bash
# showkey -a


# =============================================
# DEFAULTS
# =============================================
fname=""
line_show_begin=1
line_show_begin_last=-1
console_lines_correction=4
timeout_watch=2
timeout_read=.1


# =============================================
# DEFINE Escape-Sequences
# =============================================

# http://ascii-table.com/ansi-escape-sequences-vt-100.php

ESC_clr_line='\033[K'
ESC_reset_screen='\033c'
ESC_clr_screen='\033[2J'
ESC_cursor_pos='\033[0;0f'
ESC_cursor_home='\033[H'


# =============================================
# FUNCTIONS
# =============================================


function fn_help() {
cat << EOF
Usage: ./$0 [-n <timeout>] [<file>]  ,  timeout >0.1s , default 2s
EOF
}


function get_options() {

    [[ "$1" == "" ]] && { fn_help ; exit 1 ; }

    while [ -n "$1" ]; do

        case "$1" in

        -h|--help) 
            fn_help
            ;;

        -n) 
            [[ "$2" == "" ]] && { echo "Error: option -n required <timeout>" ; exit 1 ; }
            if [[ "$(echo "$2<0.1"|bc)" == "0" ]] ; then 
                timeout_watch="$2" 
                shift
            else
                echo "Error: timeout <0.1 not allowed"
                exit 1
            fi
            ;;

        -*) 
                echo "Error: unknown option »$1«"
                exit 1
            ;;

        *)
            if [[ -f "$1" ]] ; then
                fname=$1
            else
                echo "Error: file not found »$1«"
                exit 1
            fi
            ;;

        esac

        shift

    done

    [[ "$fname" == "" ]] && { echo "Error: file required" ; exit 1 ; }

}


function fn_print_headline() {

    hdl_txt_right="${HOSTNAME}: $(date "+%Y-%m-%d %H:%M:%S")"
    hdl_txt_left="$fname , ${timeout_watch}s , $line_show_begin"

    hdl_txt_left_length=${#hdl_txt_left}

    printf '%s%*s\n\n' "$hdl_txt_left" "$(($console_columns-$hdl_txt_left_length))" "$hdl_txt_right"

}


function fn_print_file() {

    # ---------------------------------------------------
    # file lenght can change while watch
    # ---------------------------------------------------

    lines_fname=$(awk 'END {print NR}' $fname)

    line_last=$(($lines_fname-$console_lines))

    (( "$line_last" < "1" )) && { line_last=1; clear; }

    (( "$line_show_begin" > "$line_last" )) && { line_show_begin=$line_last; clear; }


    # ---------------------------------------------------
    # print postion changed
    # ---------------------------------------------------

    if (( "$line_show_begin" != "$line_show_begin_last" )) ; then

        line_show_begin_last=$line_show_begin;
        clear

    else

        printf $ESC_cursor_home

    fi


    # ---------------------------------------------------
    # print file section
    # ---------------------------------------------------

    fn_print_headline
    awk -v var1="$line_show_begin" -v var2="$console_lines" 'NR>=var1 {if (NR>var1+var2) {exit 0} else {printf "%s\n",$0 } }' $fname

}


function fn_console_size_change() {

    console_columns=$(tput cols)
    console_lines=$(($(tput lines)-$console_lines_correction))
    line_show_begin_last=-1

}


function fn_quit() {

    echo "quit" $0 , $?

    setterm -cursor on ; exit 0

}


# =============================================
# GET OPTIONS
# =============================================

get_options "$@"    # pass all arguments with double-quotes



# =============================================
# INIT TRAP
# =============================================

trap "fn_console_size_change" SIGWINCH # https://en.wikipedia.org/wiki/Signal_(IPC)#SIGWINCH
trap "fn_quit" INT TERM EXIT


# =============================================
# MAIN
# =============================================

fn_console_size_change
setterm -cursor off


while true ; do

    fn_print_file

    read -rsn1 -t $timeout_watch k # char 1

    case "$k" in

    [[:graph:]])
        # Normal input handling
        ;;
    $'\x09') # TAB
        # Routine for selecting current item
        ;;
    $'\x7f') # Back-Space
        # Routine for back-space
        ;;
    $'\x01') # Ctrl+A
        # Routine for ctrl+a
        ;;
    $'\x1b') # ESC

        read -rsn1 k # char 2
        [[ "$k" == ""  ]] && return  Esc-Key
        [[ "$k" == "[" ]] && read -rsn1 -t $timeout_read k # char 3
        [[ "$k" == "O" ]] && read -rsn1 -t $timeout_read k # char 3

        case "$k" in

        A)  # Arrow-Up-Key
            (( "$line_show_begin" > "1" )) && line_show_begin=$(($line_show_begin-1))
            ;;

        B)  # Arrow-Down-Key
            (( "$line_show_begin" < "$line_last" )) && line_show_begin=$(($line_show_begin+1))
            ;;

        H)  # Pos1-Key
            line_show_begin=1
            ;;

        F)  # End-Key
            line_show_begin=$line_last
            ;;

        5)  # PgUp-Key
            read -rsn1 -t $timeout_read k # char 4

            if [[ "$k" == "~" ]] && (( "$line_show_begin" > "$(($console_lines/2))" )) ; then
                line_show_begin=$(($line_show_begin-$console_lines/2))
            else
                line_show_begin=1
            fi
            ;;

        6)  # PgDown-Key
            read -rsn1 -t $timeout_read k # char 4

            if [[ "$k" == "~" ]] && (( "$line_show_begin" < "$(($line_last-$console_lines/2))" )) ; then
                line_show_begin=$(($line_show_begin+$console_lines/2))
            else
                line_show_begin=$line_last
            fi
            ;;

        esac

        read -rsn4 -t $timeout_read    # Try to flush out other sequences ...

        ;;

    esac

done

1

আপনি ওয়াচচল পাইথন প্যাকেজ ব্যবহার করতে পারেন ; এর ব্যবহার ঘড়ির মতোই।

sudo pip install watchall

উত্তরটি যথেষ্ট বিশদ নয় বলে প্রস্তাবিত প্রোগ্রামটি উপযুক্ত নয় বলেই কি এটি হ্রাস পেয়েছে?
আরটিবিকার্ড

1
আমি ডাবটি ডাউনলোড করেছি। তুলনায় pwatch, দেখে মনে হচ্ছে এটি -dক্যানের মতো আলাদা করার পক্ষে সমর্থন করে watch। এটি বেঁধে দেয় PgUp/ PgDn, এটি কাস্টম অন্তরগুলিও সমর্থন করে।
জেরেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.