বাশ: ব্যবহারকারীর জন্য পরবর্তী প্রম্পটে আউটপুট কমান্ড কীভাবে করবেন?


2

বাশ স্ক্রিপ্টে, আমি শেষে একটি কমান্ড আউটপুট করতে চাই, সুতরাং ব্যবহারকারীকে Enterআমার ক্রিপ্টটি এই কমান্ডটি সম্পাদন শেষ করার পরে কেবল চাপতে হবে ।

যেমন ব্যবহারকারীর নির্দিষ্ট পরামিতি সহ একটি কমান্ড চালানো দরকার। এগুলি নিজে লিখে দেওয়ার পরিবর্তে, আমার স্ক্রিপ্টটি তাদের কমান্ড লাইনের পরামিতি সহ কমান্ড আউটপুট করে, তারপরে প্রস্থান করে। এই সময়ে আমার স্ক্রিপ্ট শেষ হয়েছে। ব্যবহারকারী এটিতে "প্রাক লিখিত" কমান্ড সহ একটি নতুন প্রম্পট দেখবে।

এই জিআইএফটির একটি ধারণা দেওয়া উচিত আমি কী সম্পর্কে বলছি:

উদাহরণ

এইচটিআরটি এবং কিউএফসি-র মতো বেশ কয়েকটি প্রোগ্রামে আমি এই আচরণটি দেখেছি এবং আমি মনে করি এমনকি এটি স্ট্যান্ডার্ড বিপরীত-আই-অনুসন্ধানও করে।

আমি যা ভাবতে পারি তার জন্য আমি গুগল অনুসন্ধান করেছি কিন্তু আমি এর উত্তর পাই না।


কার্যকারণ: এটি কি আপনার কমান্ড লাইনের প্রতিধ্বনি করার মতো কাজ করবে যা আপনি আপনার স্ক্রিপ্টের শেষ বিবৃতি হিসাবে ব্যবহারকারীর সাথে ইন্টারঅ্যাকশনটির জন্য অপেক্ষা করছেন যা enterনিশ্চিত করতে চাপতে পারে (তারপরে স্ক্রিপ্টটি এটি কার্যকর করবে এবং প্রস্থান করবে) বা বাধা (সিটিআরএল) -সি) বা সংশোধন / মুছুন (এটি একটি নতুন কমান্ড কার্যকর করা হবে বা কিছুই না)?
হাস্তুর

না, কমান্ডটি কেবলমাত্র "উত্স ~ / .bashrc", যা কোনও ব্যবহারের জন্য প্যারেন্ট শেলতে করতে হবে।
লাসে মায়ার

আপনি আরও ভাল ব্যাখ্যা করতে পারেন? প্রশ্নে আপনি বলেছিলেন যে আপনি কোনও উপায় খুঁজতে চান যাতে আপনার স্ক্রিপ্টটি কিছু ক্রিয়াকলাপ চালায় এবং ব্যবহারকারীর জন্য পরামিতি সহ কমান্ড তৈরি করে। তারপরে আপনি সিএলআই - তে কমান্ডটি "প্রাক-লিখন" করতে চান যাতে ব্যবহারকারীর কেবল এটি সম্পাদন করতে enter টিপতে হয়। (রি-সোর্সিং সম্পর্কে সতর্কতা ~/.bahsrc, যা প্রতিটি ইন্টারেক্টিভ বাশ শেলের জন্য কার্যকর করা হবে)। বিটিডব্লিউ প্রস্তাবিত সমাধানটি (উপরের মন্তব্যে এবং নীচের উত্তরে মন্তব্যে) ছিল একটি স্ক্রিপ্টে কমান্ড লিখতে readline, এবং ব্যবহারকারীর সাথে কথোপকথনের ঠিক পরে বেরিয়ে আসা। কোনও প্যাকেজ ইনস্টল না করে ...
হস্তুর

... যদি আপনি ব্যবহারকারীর জন্য যে আদেশটি তৈরি করতে চান তা হ'ল source somethingআপনাকে স্ক্রিপ্টটি কার্যকর করতে হবে না তবে কেবলমাত্র এটির উত্স রয়েছে (এবং উত্সটিও কিছু উত্স থেকে স্রোত হবে ..)।
হাস্তুর

কমান্ডটি ক্লিমে প্রাক-লিখিত হওয়ার কথা, আমার স্ক্রিপ্টটি বেরিয়ে যাওয়ার পরে। এবং স্ক্রিপ্ট নিজেই উত্সাহিত করা যাবে না।
লাসে মায়ার

উত্তর:


1

আপনি যদি এক্স ব্যবহার করছেন, এক্সডটুল সরঞ্জামটি সমাধান হতে পারে, স্ক্রিপ্টে একটি কমান্ড যেমন:

xdotool type command-line-to-display

যদি নতুন পাঠ্য স্ক্রিপ্ট আউটপুটটির সাথে মিশে যায় তবে কিছু অ্যাক্রোব্যাটিক্সের প্রয়োজন হতে পারে।


দুর্দান্ত, এটিই কেবলমাত্র একমাত্র উত্তর যা ব্যবহারকারীর কাছ থেকে কোনও অতিরিক্ত আদেশ ছাড়াই ঠিক তাই করতে চাই। এবং আমি ইতিমধ্যে স্ক্রিপ্টে একগুচ্ছ জিনিস ইনস্টল করছি, সুতরাং আরও একটি সরঞ্জাম ঠিক আছে।
লাসে মায়ার

এটির সাথে একমাত্র সমস্যাটি হ'ল এই কমান্ডটি স্ক্রিপ্ট শেষ হওয়ার আগেই কমান্ডটি স্টডআউট করার জন্য মুদ্রণ করে, এমনকি আপনি যদি &> / dev / নাল থেকে পুনরায় বিভ্রান্ত হন। তবে শেষ পর্যন্ত, ডান কমান্ডটি "প্রাক-লিখিত" যেমনটি আমি চেয়েছিলাম তেমন।
লাসে মায়ার

স্টডআউট এ আউটপুটিং বন্ধ করার একটি উপায় অবশ্যই আছে। উত্স উপলব্ধ এবং অধ্যয়ন এবং সংশোধন করা যেতে পারে। এক্সডটুল ব্যবহারকারীদের মেলিং তালিকাটি রয়েছে xdotool-users@googlegroups.comএবং এখনও সক্রিয় হতে পারে যদিও ওয়েবসাইটটি সর্বশেষ 25 এপ্রিল 2015 এ আপডেট হয়েছিল The লেখকের নাম জর্দান সিসেল এবং স্পষ্টতই তার ইমেল jls at semicomplete.com
harrymc

3

আপনার বাশ স্ক্রিপ্টের শেষে এই লাইনগুলি যুক্ত করুন:

MY_COMMAND="ls"
MY_PARAMS=()
read -a MY_PARAMS -p $MY_COMMAND 
exec $MY_COMMAND ${MY_PARAMS[@]}

এটি ধরে নিয়েছে যে আপনি যে আদেশটি কার্যকর করতে চান তা হ'ল ls , এটি আপনার উপযুক্ত অনুসারে এটি পরিবর্তন করুন। আপনি যা প্রবেশ করেন তা এমওয়াইপাআরএএমএস নামে একটি অ্যারে হিসাবে সঞ্চয় করা হয়, প্রথম লাইনের মাধ্যমে আরম্ভ করা; কমান্ডটি তারপরে অ্যারে ভেরিয়েবলের সম্প্রসারণের পরে কমান্ডটি পুনরুক্ত করে কার্যকর করা হয়, যার অর্থ এর সমস্ত উপাদান। উপরেরটি আপনার কমান্ডে কতগুলি উপাদান অতিক্রম করে তার থেকে পৃথক। এক্সিকিউট শেল কমান্ড শেলটি প্রদত্ত কমান্ডের সাথে প্রতিস্থাপন করে, কার্যকরভাবে আপনার স্ক্রিপ্টটি সমাপ্ত করে।

সম্পাদনা :

আপনি যদি আপনার স্ক্রিপ্টে পূর্ণ কমান্ড সম্পাদনার ক্ষমতা যুক্ত করতে চান তবে পঠন- পাঠকের যা যা রয়েছে তার চেয়ে অনেক বেশি , আপনি নিম্নলিখিতটি করতে পারেন: rlwrap ইনস্টল করুন , তারপরে আপনার বাশ স্ক্রিপ্টের নীচে নীচের কোডটি যুক্ত করুন:

stty -ixon
MYINPUT=()
HISTORY=$HOME/.bash_history
MYCOMMAND="ls"
MYINPUT=$(rlwrap -H $HISTORY -P $MYCOMMAND sh -c 'read REPLY && echo $REPLY')
stty ixon
exec sh -c "${MYINPUT[@]}"

rlwrap একটি প্রোগ্রাম যা সমস্ত বৈশিষ্ট্য ব্যবহার করতে সক্ষম হয় readline , খুব দরিদ্র ব্যাশ অসদৃশ -e পড়া বিকল্প। এটি আপনাকে এমন ফাইল সুনির্দিষ্ট করতে দেয় যেখানে সম্ভাব্য পরিপূর্ণতাগুলি অনুসন্ধান করতে হবে (আমি উপরে বাশ ইতিহাস, OME হোম / .বাশ_ইস্ত্রি ব্যবহার করেছি, তবে আপনি নিজের ফাইলটি লিখতে পারেন)। এছাড়াও এটিকে কনফিগার করা যেতে পারে (দেখুন inputrc অধ্যায় readline ম্যানুয়াল ) আপনি মধ্যে নির্বাচন করতে পারবেন এ গিয়ে Emacs -style এবং ষষ্ঠ -style সম্পাদনা, এবং আপনি এগিয়ে মিলের জন্য অনুসন্ধান করতে পারবেন ( Ctrl+ + r) অথবা অনুন্নত ( Ctrl+ + sইতিহাস ফাইলের মধ্যে), কমান্ডগুলি সম্পাদনা করুন এবং আরও অনেক কিছু।

আমি stty -ixon / set ixon বিকল্পগুলি যুক্ত করেছি কারণ বেশিরভাগ টার্মিনাল এমুলেটরগুলি নিয়ন্ত্রণ সিক্যুয়েন্স Ctrl+ rএবং Ctrl+ এবং আরও কিছুগুলিকে বাধা দেয় sএবং এটি এই সময়ের জন্য এই বৈশিষ্ট্যটি অক্ষম করে।

এছাড়াও, কমান্ড ইচ্ছা (আমি ব্যবহার অর্থবোধক উদ্দেশ্যে জন্য) লোড করা হয়, এবং মৃত্যুদন্ড কার্যকর করা যেতে পারে হিসাবে (আগমন আঘাত দ্বারা) অথবা পরিবর্তিত মাধ্যমে readline ক্ষমতার rlwrap

উপরেরটি যা করতে পারে না তা হ'ল সম্ভাব্য ম্যাচের একটি তালিকা প্রদর্শন করা, যা আপনাকে আপনার কীপ্যাডের মাধ্যমে চয়ন করতে দেয়। এর জন্য কিছু BASH প্রোগ্রামিং প্রয়োজন ( ডার্ক্টের উত্তর দেখুন)।


1
তবে স্ক্রিপ্টটি সম্পাদনকারী
পিতৃ

তার উত্তরের মূলটি হ'ল আপনি কমান্ডটিকে একটি সাধারণ স্ট্রিংয়ের মতো আচরণ করেন যেখানে আপনি এটি সম্পাদন করেন।
সিরেক্স

@ ডিরক্ট সত্য নয়, উভয় সংস্করণে প্রদত্ত কমান্ডটি (আমি উদাহরণের জন্য ls ব্যবহার করেছি) প্রাক লোড করার একটি উপায় রয়েছে।
মারিয়াসমাতুটিয়

1

পুরো উত্তর নয়, তবে আপনি যা দেখেছেন তার একটি ব্যাখ্যা:

আপনি কিউএফসি কিউএফসি.এস পরীক্ষা করে এটি কীভাবে করেন তা একবার দেখে নিতে পারেন । এটা দুই শেল বিশেষ বৈশিষ্ট্য ব্যবহার: জন্য zsh , zleকমান্ড এবং জন্য ব্যাশ , READLINE_LINEপরিবর্তনশীল। এছাড়াও, উভয় রূপগুলি একটি ফাংশন ব্যবহার করে যা শেলের মধ্যেই ডাকা হয়, তারা কেবল একটি স্ক্রিপ্ট শুরু করে না এবং প্রস্থান করার সময় সেই তথ্যটি উপলব্ধ করে।

কোনও স্ক্রিপ্ট থেকে প্রস্থান করার সময় শেল-স্বতন্ত্র উপায়ে এটি করা একটি আকর্ষণীয় সমস্যা। :-)


0

pause?

উইন্ডোজের কমান্ড প্রম্পটে pauseকমান্ড রয়েছে যা আপনি যা করতে চান তা করতে পারে।

এটি "চালিয়ে যেতে কোনও কী টিপুন ..." আউটপুট দেয় তবে এর আউটপুট এড়ানো যায় pause > nulযা ডিফল্টরূপে স্ক্রিনের পরিবর্তে তার নিজস্ব আউটপুট কোথাও পুনর্নির্দেশ করে by


ধন্যবাদ, তবে আমি যা বোঝাতে চাইছিলাম তা মোটেই নয়। আমি স্পষ্টকরণের জন্য একটি উদাহরণ যুক্ত করেছি। এছাড়াও, উইন্ডোজ নয় লিনাক্স।
লাসে মেয়ার

0

এখানে বাশ / ব্যবহার করে উদাহরণ সহ একটি সংক্ষিপ্ত (, কুশল ?, বগি?) বাস্তবায়ন দেওয়া হচ্ছে।

inline.sh:

inline () {
    stty_backup=$(stty -g)
    #I don't know why exactly, I just faced it
    stty sane
    res=$($READLINE_LINE 3>&1 >/dev/tty)
    stty $stty_backup
    READLINE_LINE=$res
    READLINE_POINT=${#READLINE_LINE}
}
#the bind is Alt-!, you can change it
bind -x '"\e!":"inline"'

hello.sh:

#!/bin/bash
echo Do you want:
echo 1 past?
echo 2 present?
echo 3 futur?

read -p "1 or 2 or 3? " r

if [ "$r" = "1" ]; then r="uptime"
elif [ "$r" = "2" ]; then r="date"
elif [ "$r" = "3" ]; then r="fortune fortunes"
else r=""
fi

echo $r >&3

আপনার স্ক্রিপ্টটি যথেষ্ট স্মার্ট হওয়া দরকার, আপনার প্রম্পটে আপনি যে স্ট্রিংটি ফিরিয়ে দিতে চান তা এফডি 3 (ইনলাইন.শ দেখুন) এর মাধ্যমে ফিরে আসতে হবে।

এখন,

source inline.sh

আদর্শ

./hello.sh

Alt- টিপুন!

আপনি অবশ্যই আপনার বাশার্কে ইনলাইন.এস উত্স করতে পারেন।


0

কার্যসংক্রান্ত:

আপনার স্ক্রিপ্টের শেষ লাইনে আপনি এমন কিছু লিখতে পারেন:

PrebuildCOMMAND="ls -lrt"             # just as example
echo "That's your command "           # keep your user informed
read -e -p " " -i "$PrebuildCOMMAND"  CMDtoEXECUTE
$CMDtoEXECUTE                         # here you execute what it was answered

দ্রষ্টব্য: আমি এখনই লক্ষ্য করেছি যে এটি অন্য উত্তরের (আরও সম্পূর্ণ) প্রস্তাবিতগুলির একটি বৈকল্পিক (সরলীকৃত )।

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