টার্মিনালে লেখাটি প্রিন্ট করা যায় কীভাবে?


27

আমার একটি সহজ echoমুদ্রণ আছে যা আমি আমারতে যুক্ত করেছি .bashrc:

echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
sleep 2s
echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
echo "$(tput setaf 2)Wake up neo....."
sleep 2s
echo "$(tput setaf 2)The Matrix has you......"
sleep 2s
reset
echo "$(tput setaf 2)Follow the white rabbit......"
sleep 2s
reset
cmatrix

এটি টার্মিনালে একটি বার্তা প্রিন্ট করে, তবে আমি এটি দেখতে চাই যেন এটি টাইপ করা হয় তবে অক্ষরের মধ্যে ধারাবাহিকভাবে বিলম্ব হয়।


1
বাস্তববাদী হওয়ার জন্য আমি মনে করি আপনার সংশোধন করার জন্য এক বা একাধিক পিছনের জায়গা দিয়ে এলোমেলো টাইপ করা উচিত। উদাহরণস্বরূপ, এই মন্তব্যটি টাইপ করার সময় আমাকে এটিকে "নিক্ষেপ" করতে সংশোধন করার জন্য "" মাধ্যমে "স্পেস ব্যাক করতে হয়েছিল। এটি উত্তর দেওয়া আরও কঠিন প্রশ্ন করে তবে এটি আরও বাস্তববাদী করে তোলে। অক্ষরগুলি যদি 30 সিপিএস বা 60 সিপিএসের স্থির গতিতে পুনরাবৃত্তি হয় তবে এটি কম মানব দেখাচ্ছে। নির্দিষ্ট কীগুলি একসাথে দ্রুত টাইপ করা হয়, অন্য কী সংমিশ্রণগুলি ধীরে ধীরে প্রদর্শিত হয়। গতিতে কী সংমিশ্রণের সাথে কিছু ধরণের প্যাটার্ন মেলানো দরকার।
WinEunuuchs2 ইউনিক্স

2
@ WinEunuuchs2Unix আমার মনে হয় না এটি এখনও সিম্প্লি সিম্প্লিফাইন্ডড। ;)
মিষ্টান্ন

উত্তর:


28

এটি ওয়েল্যান্ডের সাথে কাজ করে না; আপনি যদি উবুন্টু 17.10 ব্যবহার করছেন এবং লগইনে Xorg ব্যবহার করতে পরিবর্তন না করেন তবে এই সমাধানটি আপনার জন্য নয়।

আপনি এটি xdotool এক্সডটুল ইনস্টল করুনজন্য ব্যবহার করতে পারেন । যদি কীস্ট্রোকের মধ্যে বিলম্ব সামঞ্জস্যপূর্ণ হওয়া উচিত তবে এটি এতটা সহজ:

xdotool type --delay 100 something

প্রতিটি কীস্ট্রোকের মধ্যে মিলিসেকেন্ডের somethingবিলম্বের সাথে এই ধরণের 100


যদি কীস্ট্রোকের মধ্যে বিলম্ব এলোমেলো হওয়া উচিত , তবে 100 থেকে 300 মিলিসেকেন্ড থেকে বলি, জিনিসগুলি কিছুটা জটিল হয়ে যায়:

$ text="some text"
  for ((i=0;i<${#text};i++));
  do
    if [[ "${text:i:1}" == " " ]];
    then
      echo -n "key space";
    else
      echo -n "key ${text:i:1}";
    fi;
  [[ $i < $((${#text}-1)) ]] && echo -n " sleep 0.$(((RANDOM%3)+1)) ";
  done | xdotool -

এই forলুপ স্ট্রিং পরিবর্তনশীল সংরক্ষিত প্রতি একক অক্ষর মাধ্যমে যায় textপারেন, প্রিন্টিং key <letter>বা key spaceএকটি স্থান দ্বারা অনুসরণ ক্ষেত্রে sleep 0.এবং 1 এবং 3 এর মধ্যে একটি র্যান্ডম সংখ্যা ( xdotool'র sleepব্যাখ্যা সেকেন্ড যেমন নম্বর)। লুপটির পুরো আউটপুটটি তারপরে পাইপ করা হয় xdotool, যা মাঝে মাঝে এলোমেলো বিলম্বের সাথে অক্ষরগুলি মুদ্রণ করে। আপনি যদি বিলম্ব পরিবর্তন করতে চান তবে কেবল অংশটি পরিবর্তন করুন , নিম্ন এবং উপরের সীমাটি - 0.2 থেকে 0.5 সেকেন্ডের জন্য এটি হবে ।(RANDOM%x)+yyx-1+y(RANDOM%4)+2

মনে রাখবেন যে এই পদ্ধতিটি পাঠ্যটি প্রিন্ট করে না , বরং এটি একেবারে টাইপ করুন যেমন ব্যবহারকারীর মতো হয়, একক কীকে সংশ্লেষ করে। ফলস্বরূপ পাঠ্যটি বর্তমানে দৃষ্টি নিবদ্ধ করা উইন্ডোটিতে টাইপ করা হয়; আপনি যদি পরিবর্তিত হন তবে পাঠ্যের ফোকাস অংশটি নতুন ফোকাসযুক্ত উইন্ডোতে টাইপ হবে যা আপনি যা চান তা হতে পারে বা নাও পারে। উভয় ক্ষেত্রেই এখানে অন্য উত্তরগুলির দিকে নজর দিন, এর সবগুলিই উজ্জ্বল!


24

@ মিষ্টান্নের উত্তরটি পড়ার পরে আমি xdotool চেষ্টা করেছি তবে কোনও কারণে এটি কাজ করতে পারা যায় না। সুতরাং আমি এটি নিয়ে এসেছি:

while read line
do
    grep -o . <<<$line | while read a
    do
        sleep 0.1
        echo -n "${a:- }"
    done
    echo
done

উপরের কোডে আপনার পাঠ্যটি পাইপ করুন এবং এটি টাইপের মতো মুদ্রিত হবে। এছাড়াও আপনি প্রতিস্থাপন যদৃচ্ছতা যোগ করতে পারেন sleep 0.1সঙ্গে sleep 0.$((RANDOM%3))

জাল টাইপগুলি সহ প্রসারিত সংস্করণ

এই সংস্করণটি এখন থেকে প্রতিটি সময়ে একটি নকল টাইপ চালু করবে এবং এটি সংশোধন করবে:

while read line
do
    # split single characters into lines
    grep -o . <<<$line | while read a
    do
        # short random delay between keystrokes
        sleep 0.$((RANDOM%3))
        # make fake typo every 30th keystroke
        if [[ $((RANDOM%30)) == 1 ]]
        then
            # print random character between a-z
            printf "\\$(printf %o "$((RANDOM%26+97))")"
            # wait a bit and delete it again
            sleep 0.5; echo -ne '\b'; sleep 0.2
        fi
        # output a space, or $a if it is not null
        echo -n "${a:- }"
    done
    echo
done

আমি মনে করি পরিবর্তে আমি এটি করব: while IFS= read -r line; do for (( i = 0; i < ${#line}; i++ )); do sleep 0.1; printf "%s" "${line:i:1}"; done; echo; done( ;নতুন লাইনের সাথে প্রতিস্থাপন করুন এবং প্রয়োজনীয় হিসাবে ভাল ইনডেন্টেশন)। IFS= read -rএবং printf "%s"নিশ্চিত করুন যে হোয়াইটস্পেস এবং বিশেষ অক্ষর কোন ভিন্নভাবে চিকিত্সা করা হয় না। এবং grepঅক্ষরে বিভক্ত প্রতিটি লাইনের অনাকাঙ্ক্ষিত - forলাইনের প্রতিটি চরের উপরে কেবল একটি লুপই যথেষ্ট।
ডিজিটাল ট্রমা

18

আপনি অক্ষরের মধ্যে একটি ধারাবাহিক বিলম্ব উল্লেখ করেছেন, তবে আপনি যদি এটির টাইপ করার মতো দেখতে সত্যই চান তবে সময় সঠিকভাবে সামঞ্জস্যপূর্ণ হবে না। এটি অর্জন করতে আপনি আপনার নিজস্ব টাইপটি scriptকমান্ডের সাথে রেকর্ড করতে পারেন এবং এটির সাথে আবার খেলতে পারেন scriptreplay:

$ script -t -c "sed d" script.out 2> script.timing
Script started, file is script.out
Wake up ...
Wake up ...
Wake up Neo ...
Script done, file is script.out
$ 
$ scriptreplay script.timing script.out
Wake up ...
Wake up ...
Wake up Neo ...

$ 

সিটিআরএল-ডি-তে আঘাত করে রেকর্ডিং বন্ধ রয়েছে।

এটির নির্দেশিকায় -tপ্যারামিটারটি পাস scriptকরা সময় সংক্রান্ত তথ্যও উত্পন্ন করে, যা আমি script.timingফাইলে পুনঃনির্দেশিত করেছি । আমি sed dকোনও কমান্ড হিসাবে পাশ করেছি কারণ scriptএটি কোনও পার্শ্ব-প্রতিক্রিয়া ছাড়াই ইনপুট (এবং এটি কীস্ট্রোকগুলি রেকর্ড করে) কেবল শোষণ করার একটি উপায়।

আপনি যদি সমস্ত tput/ resetস্টাফও খুব করতে চান, আপনি scriptআপনার প্রতিটি লাইনের জন্য একটি রেকর্ডিং করতে এবং tput/ resetকমান্ডের সাহায্যে আন্তঃবিবিশেষে সেগুলি খেলতে পারেন ।


11

আর একটি সম্ভাবনা হ'ল ডেমো ম্যাজিক ব্যবহার করা , বা, আরও সঠিকভাবে এই স্ক্রিপ্ট সংকলনের মুদ্রণ ফাংশন হিসাবে, যা মূলত পরিমাণে

#!/bin/bash

. ./demo-magic.sh -w2

p "this will look as if typed"

ফণা অধীনে, এটি পিভি ব্যবহার করে , অবশ্যই আপনি সরাসরি পছন্দসই প্রভাব পেতে ব্যবহার করতে পারেন, মূল ফর্মটি নীচে দেখায়:

echo "this will look as if typed" | pv -qL 20

1
পিভির এই ব্যবহারটি দুর্দান্ত।
সেবাস্তিয়ান স্টার্ক

3
পাইপ করার কোন প্রয়োজন নেই echoকরার pv, শুধু ব্যবহার pv -qL20 <<< "Hello world"যদি আপনার শেল সমর্থন herestrings।
dr01

8

আমার ডাকনামের সাথে সামঞ্জস্য রেখে আমি আরও একটি সমাধান দিতে পারি:

echo "something" | 
    perl \
        -MTime::HiRes=usleep \
        -F'' \
        -e 'BEGIN {$|=1} for (@F) { print; usleep(100_000+rand(200_000)) }'

অদ্ভুত লাগছে, তাই না?

  • -MTime::HiRes=usleepমডিউল usleepথেকে ফাংশন (মাইক্রোসেকেন্ড স্লিপ) আমদানি করে Time::HiResকারণ sleepসাধারনত কেবল পূর্ণসংখ্যার সেকেন্ড গ্রহণ করে।
  • -F''প্রদত্ত ইনপুটকে অক্ষরগুলিতে বিভক্ত করে (ডেলিমিটারটি খালি হচ্ছে '') এবং অক্ষরগুলিকে অ্যারেতে রাখে @F
  • BEGIN {$|=1} আউটপুট বাফারিং অক্ষম করে যাতে প্রতিটি অক্ষর তাত্ক্ষণিকভাবে মুদ্রিত হয়।
  • for (@F) { print; usleep(100_000+rand(200_000)) } কেবল অক্ষরগুলির উপরে পুনরাবৃত্তি হয়
  • পার্লে কয়েক ধরণের কয়েক হাজার বিভাজক ব্যবহার করার জন্য সংখ্যায় আন্ডারস্কোর লাগানো একটি সাধারণ উপায়। এগুলি পার্ল দ্বারা কেবল উপেক্ষা করা হয়, তাই আমরা উদাহরণস্বরূপ 1_000(== 1000) লিখতে পারি বা এমনকি 1_0_00যদি আমরা এটি পড়ার পক্ষে সহজ মনে করি।
  • rand() 0 এবং প্রদত্ত আর্গুমেন্টের মধ্যে একটি এলোমেলো সংখ্যা প্রদান করে, সুতরাং একসাথে এটি 100,000 এবং 299,999 মাইক্রোসেকেন্ডের (0.1-0.3 সেকেন্ড) এর মধ্যে ঘুমায়।

মাত্র কৌতূহলের বাইরে: rand()0 থেকে আর্গুমেন্টে (আপনার উদাহরণের 100k থেকে 300k) বা তাদের (100 উদাহরণস্বরূপ 100k + 1 থেকে 300k-1 ) এর মধ্যে কোনও সংখ্যা ফিরে আসে ?
মিষ্টান্ন

1
এটি ব্যবধানে [0,200k)0, তবে 200 কে বাদ দিয়ে একটি সংখ্যা প্রদান করে । সঠিক আচরণ এখানে নথিভুক্ত : "রিটার্নস একটি র্যান্ডম ভগ্ন সংখ্যা এর চেয়ে বড় বা EXPR মান কম 0 এবং সমান (EXPR ইতিবাচক হওয়া উচিত।)।"
PerlDuck

1
এটি -a এবং -n ছাড়া কাজ করে না
ruuenza

@ রারাউঞ্জা যেহেতু পার্ল ৫.২০ এর মধ্যে রয়েছে-Fবোঝা -aএবং -aবোঝা -n
পার্লডাক

আহ, ঠিক আছে আমি 5.16 ব্যবহার করছিলাম, যা সেন্টোএস 7 এ রয়েছে।
ruuenza

6

আর একটি সরঞ্জাম যা কাজ করতে পারে, যা এক্স 11 বা যা কিছু নির্ভর করে না, এটি অ্যাসিচাইনেমা । এটি আপনার টার্মিনালে যা কিছু করা যায় তা রেকর্ড করে এবং আপনাকে পুনরায় খেলতে দেয় যে এটি যদি স্ক্রিন ক্যাপচার হয় তবেই কেবল এটি নির্ভুলভাবে আসকি ভিত্তিক হয়! এটি সম্পূর্ণরূপে দৃশ্যমানভাবে পরিষ্কার হওয়ার জন্য আপনার প্রম্পটটি অস্থায়ীভাবে অক্ষম করতে হতে পারে। অন্যরা যেমন উল্লেখ করেছে, ধারাবাহিকভাবে দেরি করা প্রাকৃতিক দেখায় না এবং এটিকে টাইপ করা আপনার পক্ষে অর্জন করা সবচেয়ে প্রাকৃতিক চেহারা হতে পারে।

পাঠ্যটি রেকর্ড করার পরে, আপনি এর মতো কিছু করতে পারেন:

$ asciinema play [your recording].cast; cmatrix

6

আমি অবাক হয়েছি এখনও কারও এটির উল্লেখ নেই তবে আপনি স্টক সরঞ্জাম এবং একটি লুপ দিয়ে এটি সম্পাদন করতে পারেন:

typeit() {
    local IFS=''
    while read -n1 c; do
        echo -n "$c"
        sleep .1
    done <<< "$1"
}

এটি কেবল অক্ষর অনুসারে ইনপুট চরিত্রের উপরে লুপ করে এবং প্রতিটিের পরে একটি বিলম্বের সাথে এগুলি মুদ্রণ করে। একমাত্র কৌটিক বিট হ'ল আপনাকে আপনার আইএফএসকে একটি খালি স্ট্রিংয়ে সেট করতে হবে যাতে বাশ আপনার স্পেসগুলি পৃথক করার চেষ্টা না করে।

এই সমাধানটি মৃত-সহজ, সুতরাং অক্ষর, টাইপসগুলির মধ্যে ভেরিয়েবল বিলম্ব যুক্ত করুন, যা খুব সহজ।

সম্পাদনা (ধন্যবাদ, @ ডিজিটার): আপনি যদি কিছুটা আরও প্রাকৃতিক ইন্টারফেস চান, তবে পরিবর্তে আপনি এটি করতে পারেন

typeit() {
    local IFS=''
    while read -n1 c; do
        echo -n "$c"
        sleep .1
    done <<< "$@"
}

এটি আপনাকে ফাংশনটির typeit foo barপরিবর্তে কল করার অনুমতি দেবে typeit 'foo bar'। সচেতন হতে হবে যে উদ্ধৃতি চিহ্ন বিনা যুক্তি, ব্যাশ এর শব্দ বিভাজন সাপেক্ষে তাই উদাহরণস্বরূপ typeit foo<space><space>barপ্রিন্ট হবে foo<space>bar। সাদা স্থান সংরক্ষণ করতে, উদ্ধৃতি ব্যবহার করুন।


ভাল পরামর্শ, যদিও এটি লক্ষ করা উচিত যে শব্দ বিভাজন প্রযোজ্য। উদাহরণস্বরূপ, typeit foo<space>barফলাফল হবে foo bar, যেখানে এছাড়াও ফলাফল typeit foo<space><space>barহবে । এটির ভারব্যাটিকাম তা নিশ্চিত করার জন্য আপনি এটি উদ্ধৃত করেছেন। @ ডেজার্ট একটি সম্পাদনা পরামর্শ নির্দ্বিধায়। আমি নিজে এটি করতে পারি, তবে আমি আপনাকে এর কৃতিত্ব পাওয়ার সুযোগ দিতে চাই। foo bar
Whereswalden

আমাকে সম্পর্কে শেখানোর জন্য +1 read -n1(যা বিটিডাব্লু। read -k1জেডএসে রয়েছে)
সেবাস্তিয়ান স্টার্ক

5

প্রথমত, "চরিত্রগুলির মধ্যে ধারাবাহিক বিলম্বের সাথে এটি টাইপ করা হ'ল দেখুন ..." অন্যেরা উল্লেখ করেছেন বলে কিছুটা পরস্পরবিরোধী। কিছু টাইপ করার ক্ষেত্রে ধারাবাহিক বিলম্ব হয় না। আপনি যখন কোনও অসঙ্গতিপূর্ণ বিলম্বের সাথে উত্পাদিত কিছু দেখেন, আপনি শীতল হবেন। "আমার কম্পিউটারে কি নিয়ে গেছে !!! ??!?"

যাই হোক ...

আমাকে চিৎকার করতে হবে expectযা বেশিরভাগ লিনাক্স বিতরণে পাওয়া উচিত। ওল্ড স্কুল, আমি জানি, তবে- এটি ইনস্টল করা- ধরে নেওয়া- এটি খুব সহজ হতে পারে:

echo 'set send_human {.1 .3 1 .05 2}; send -h "The Matrix has you......\n"' | expect -f /dev/stdin

ম্যান পৃষ্ঠা থেকে:

-H ফ্ল্যাগটি আউটপুটকে পাঠাতে বাধ্য করে (কিছুটা) মানুষের আসলে টাইপ করার মতো। চরিত্রগুলির মধ্যে মানুষের মতো বিলম্ব ঘটে। (অ্যালগোরিদমটি একটি ওয়েইবুল বিতরণের উপর ভিত্তি করে এই বিশেষ অ্যাপ্লিকেশনটির সাথে সামঞ্জস্য করার পরিবর্তিত পরিবর্তন রয়েছে)) এই আউটপুটটি "সেন্ড_হিউম্যান" ভেরিয়েবলের মান দ্বারা নিয়ন্ত্রিত হয় ...

Https://www.tcl.tk/man/expect5.31/expect.1.html দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.