টার্মিনাল থেকে জিইউআই শুরু করার সময় বিরক্তি দূর করার উপায় কীভাবে?


14

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

কমান্ড লাইন আর্গুমেন্ট গ্রহণ করবে এবং স্বতঃপূরণ হ্যান্ডেল করবে এই সমস্যাগুলির জন্য কী সমাধান?

সম্পর্কিত: /programming/7131670/make-bash-alias-that-takes-parameter

উত্তর:


15

/dev/nullপ্রারম্ভিক ত্রুটিটিকে তাত্ক্ষণিকভাবে পুনর্নির্দেশ করা খারাপ ধারণা যা এটি প্রারম্ভিক ত্রুটি বার্তাগুলি গোপন করবে এবং ব্যর্থতাগুলি ডায়াগনস্টিকের পক্ষে কঠিন হতে পারে। আমি নিম্নলিখিত start-appzsh স্ক্রিপ্ট মত কিছু প্রস্তাব :

#!/usr/bin/env zsh
coproc "$@" 2>&1
quit=$(($(date +%s)+5))
nlines=0
while [[ $((nlines++)) -lt 10 ]] && read -p -t 5 line
do
  [[ $(date +%s) -ge $quit ]] && break
  printf "[%s] %s\n" "$(date +%T)" "$line"
done &

কেবল এটির সাথে চালান: start-app your_command argument ...

এই স্ক্রিপ্টটি সর্বাধিক 10 লাইন বার্তাগুলি এবং সর্বাধিক 5 সেকেন্ডের জন্য আউটপুট দেয়। তবে দ্রষ্টব্য যে অ্যাপ্লিকেশনটি অবিলম্বে ক্রাশ হয়ে গেলে (যেমন বিভাগের ত্রুটির কারণে), আপনি কোনও ত্রুটি বার্তা দেখতে পাবেন না। অবশ্যই, আপনি যা চান তা করতে আপনি বিভিন্ন উপায়ে এই স্ক্রিপ্টটি সংশোধন করতে পারেন ...

দ্রষ্টব্য: start-appzsh এ সম্পূর্ণরূপে কাজ করতে , এটি করা যথেষ্ট:

compdef _precommand start-app

এবং ব্যাশে:

complete -F _command start-app

(এর জন্য execএবং এর timeমধ্যে একটি থেকে অনুলিপি করা হয়েছে /usr/share/bash-completion/bash_completion)।


6
সুন্দর ধারণা, +1। তবে আমি একমত নই যে জিইআইআই অ্যাপ্লিকেশন থেকে স্টাডারকে পুনঃনির্দেশ করা সাধারণভাবে একটি খারাপ ধারণা। সমস্ত ব্যবহারকারীর 99% গ্রাফিকাল ডেস্কটপ থেকে এটিকে অনুরোধ করবে, যাতে তারা কখনও স্টাডারে গিয়ে দেখেনি see সফটওয়্যারটি জিইউআইয়ের মাধ্যমে ত্রুটিগুলি রিপোর্ট করার জন্য ডিজাইন করা হয়েছে। Stdout এবং stderr এ আপনি যা দেখেন তা হ'ল সাধারণত বার্তাগুলি ডিবাগ করা হয় যা বিকাশকারীরা তা নিতে বিরত হন নি কারণ তারা ভাবেন নি যে কেউ এগুলি দেখতে পাবে।
বেন ক্রোয়েল

@ বেনক্রোয়েল আমি সম্মত হই যে জিইউআই অ্যাপ্লিকেশনগুলিকে জিইউআইয়ের মাধ্যমে ত্রুটিগুলি রিপোর্ট করা উচিত, তবে কিছু ক্ষেত্রে, জিইআইআই শুরু হওয়ার আগে অ্যাপ্লিকেশন ব্যর্থ হতে পারে। এটি বিশেষত ঘটে যখন অ্যাপ্লিকেশনটি একটি মোড়ক স্ক্রিপ্টের মাধ্যমে যুক্ত করা হয় যা আর্গুমেন্টগুলি পার্স করে (সাধারণভাবে, ব্যবহারকারীদের ক্ষেত্রে এটি ডেস্কটপ থেকে অ্যাপ্লিকেশনটি শুরু করার পরে এই সমস্যাটি নেই, তর্কগুলি সঠিক হওয়া উচিত)।
ভিঙ্ক

@ বেনক্রোয়েল আমি সেই মামলার কথাও চিন্তা করি যেখানে $DISPLAYসেট করা হয়নি (যেমন ব্যবহারকারী যদি এসএসএসের-X জন্য ব্যবহারকারী ভুলে গিয়েছিলেন ) বা এক্স অনুমোদনের সমস্যা এখানে যেমন: unix.stackexchange.com/questions/108679/…
ভিনক

@ মিকসার্ভ আমি মনে করি যে বিভিন্ন ব্যবহারকারী এই প্রশ্নে আগ্রহী হতে পারে (কেবল ওপি নয়) এবং তারা বাশ বা জেডএস ব্যবহার করতে পারে। আমি স্রেফ zsh এবং বাশ এর পরিপূরকগুলির জন্য একটি নোট যুক্ত করেছি। আপনি দেখতে পাচ্ছেন যে এটি সহজ।
ভিঙ্ক

@ মেকজারভেজ নোট করুন যে তারিখে একটি পরীক্ষা আছে। সহজ এবং আরও বহনযোগ্য, তবে কেউ যদি বৈশিষ্ট্যগুলি যুক্ত করতে চান তবে কম নমনীয়: "$@" 2>&1 | { quit=$(($(date +%s)+5)); while read line && [ $(date +%s) -lt $quit ]; do printf "[%s] %s\n" "$(date +%T)" "$line"; done; } | head -n 10 &(সর্বাধিক গুরুত্বপূর্ণ বিষয়টি ধারণাটি ছিল, আসল বাস্তবায়ন নয়)।
ভিঙ্ক

5

এই উত্তর বাশ জন্য। উদাহরণস্বরূপ, আমি evপিডিএফ ভিউয়ার এভিনিস শুরু করার জন্য একটি সুবিধামত কমান্ড তৈরি করতে আমার .bashrc এ যা করি তা এখানে ।

ev() { (evince "$1" 1>/dev/null 2>/dev/null &) }
complete -f -o default -X '!*.pdf' ev

প্রথম লাইন একটি ফাংশন সংজ্ঞায়িত করে ev। আপনি যখন কোনও কমান্ড লাইনে কোনও ফাংশনটির নাম ব্যবহার করেন তখন তা স্বীকৃত হবে:

ev foo.pdf

(এটি এলিয়াসগুলির চেয়ে আলাদা মেকানিজম, এবং এর চেয়ে কম অগ্রাধিকার রয়েছে)) স্টিন এবং স্টাডআউটে ইভিংসের আউটপুট বিটবাকেটে (/ দেব / নাল) প্রেরণ করা হয়। অ্যাম্পারস্যান্ড পটভূমিতে কাজটি রাখে। বন্ধনীগুলিতে কমান্ডকে চারপাশে ছড়িয়ে দেওয়ার ফলে এটি একটি সাব-শেলের মধ্যে চালিত হয় যাতে এটি ব্যাকগ্রাউন্ড জব তৈরি বা এটির সমাপ্তি সম্পর্কে বার্তা মুদ্রণ করে না।

আমার .bashrc এর দ্বিতীয় লাইনটি ব্যাশকে বলতে বাশের সম্পূর্ণ ফাংশন ব্যবহার করে যে ev কমান্ডের আর্গুমেন্টটি এক্সটেনশন পিডিএফ সহ একটি ফাইল হিসাবে প্রত্যাশিত। এর অর্থ হ'ল যদি আমার ডিরেক্টরিতে বসে foo.tex, foo.aux, ইত্যাদি ফাইল থাকে তবে আমি ev fooট্যাব কীটি টাইপ করতে এবং হিট করতে পারি , এবং bash ফাইলটি foo.pdf হিসাবে সম্পূর্ণ করতে জানবে।


1
বেন, ঠিক তেমনি আপনি জানেন, আপনি হয়ত ফাংশনটি কিছুটা বাড়তি করে যাচ্ছেন। কোনও অপরাধের অর্থ হ'ল না - এটি দুর্দান্ত উত্তর এবং আমি প্রথম ev() (evince "$@" >&2 &) 2>/dev/null
প্রশ্নোত্তরকে উজ্জীবিত করেছি

বাev() (evince "$@" &>/dev/null $)
গ্লেন জ্যাকম্যান

@glenn: আমি বিশ্বাস করেন যে আপনি আপনার পরামর্শের মধ্যে উপান্ত্য চরিত্র জন্য বোঝানো একটি হতে &
জি-ম্যান বলছেন 'মনিকা পুনরায় ইনস্টল করুন'

হ্যাঁ, বেশ ঠিক।
গ্লেন জ্যাকম্যান

5

আরেকটি সম্ভাবনা ব্যবহার করা commandচোখকে অবিশ্বাস করতে execA থেকে বিশেষ মত একটি প্লেইন পুরানো builtin করার builtin:

alias shh='command exec >/dev/null 2>&1'

সুতরাং এখন আপনি এটি করতে পারেন:

(shh; call some process &)

আমি সবেমাত্র লক্ষ্য করেছি যে এটি commandকাজ করে না zsh (যেমন এটি অন্যান্য বেশিরভাগ শেলগুলিতে করা হয় বলে মনে হয়) তবে যেখানে এটি কাজ করে না আপনি পরিবর্তে এটি করতে পারেন:

alias shh='eval "exec >/dev/null 2>&1"'

... যা সর্বত্র কাজ করা উচিত।

আসলে, আপনি এমনকি করতে পারেন:

alias shh='command exec >"${O:-/dev/null}" 2>&1'

সুতরাং আপনি করতে পারেন:

O=./logfile; (shh;echo can anyone hear &)
O=; (shh; echo this\? &)
cat ./logfile

আউটপুট

can anyone hear

@ ভিনক 17 এর সাথে একটি মন্তব্য আলোচনার অনুসরণ করে, এটি লক্ষণীয় যে জিইউআই অ্যাপ্লিকেশনটির প্রায় সমস্ত কনসোল আউটপুট সাধারণত Xএর টিটি - এর কনসোলের জন্য তৈরি। আপনি যখন Xকোনও X .desktopফাইল থেকে কোনও অ্যাপ চালনা করেন তবে এটি আউটপুট উত্পন্ন করে তা Xভার্চুয়াল টার্মিনালে চলে যায় - যা আপনি Xপ্রথমে চালু করেছিলেন সেখান থেকে এটিই ছিল । আমি এই tty নম্বর দিয়ে সম্বোধন করতে পারেন $XDG_VTNR

আশ্চর্যজনকভাবে যদিও - এবং সম্ভবত যে আমি সবেমাত্র ব্যবহার শুরু startxকরেছি - আমি আর লিখতে পারি না বলে মনে হয় /dev/tty$XDG_VTNR। এটি (যেমন আমি সম্ভবত বেশি সম্ভবত বলে মনে করি) এর সাথে Xorgv1.16 প্রয়োগ করা খুব সাম্প্রতিক ও কঠোর পরিবর্তনের সাথে কিছু করতে পারে যা এটি রুট সুবিধার systemdপ্রয়োজনের পরিবর্তে ব্যবহারকারীর অধীনে চলতে দেয় ।

তবুও, আমি এটি করতে পারি:

alias gui='command exec >/dev/tty$((1+$XDG_VTNR)) 2>&1'

(gui; some x app &)

এখন এর সমস্ত some x appকনসোল আউটপুট /dev/tty$((1+$XDG_VTNR))আমার xtermপ্রেটির চেয়ে বরং পরিবর্তিত হবে । আমি এর শেষ পৃষ্ঠাটি যে কোনও সময়ে পেতে পারি:

fmt </dev/vcs$((1+$XDG_VTNR))

যাইহোক আউটপুট লগ করতে কিছু ভার্চুয়াল টার্মিনাল উত্সর্গ করা সম্ভবত সেরা অনুশীলন। /dev/consoleসাধারণত ইতিমধ্যে এটির জন্য সংরক্ষিত রয়েছে, যদিও আপনি chownসম্ভবত এটি blithely লিখতে প্রয়োজন হয় না করতে পছন্দ করতে পারেন । আপনার কাছে এমন কিছু ফাংশন থাকতে পারে printkযা আপনাকে একটি করতে সক্ষম করে - যা মূলত মুদ্রণযোগ্য /dev/console- এবং তাই আমি মনে করি যেভাবে এটি ব্যবহার করতে পারে।

এটি করার আরেকটি উপায় হ'ল এই জাতীয় উদ্দেশ্যগুলির প্রতি অনুগ্রহ উত্সর্গ করা। উদাহরণস্বরূপ, আপনি xtermউইন্ডোটি উন্মুক্ত রাখতে পারেন, ttyসেখান থেকে চালিত পরিবেশের পরিবর্তনশীল অবস্থায় আউটপুট সংরক্ষণ করতে এবং সেই মানটিকে গন্তব্য হিসাবে guiআউটপুট হিসাবে ব্যবহার করতে পারেন । এই ভাবে সমস্ত লগই আলাদা লগ উইন্ডোতে স্থানান্তরিত হবে, আপনি যদি পছন্দ করেন তবে আপনি স্ক্রোল করতে পারেন।

আপনি যদি আগ্রহী হন তবে ইতিহাসের সাথে কীভাবে একই রকম কাজ করা যেতে পারে সে সম্পর্কে আমি একবার উত্তর লিখেছিলাম bash


1
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার মন্তব্যকে echo $?অপ্রয়োজনীয় তথ্য যুক্ত করার কারণে আউটপুটটি সরিয়ে ফেলুন এবং এটি ব্যাশের একটি বাগের উপর ভিত্তি করে তৈরি করা হয়েছে, যা আমি এখানে এখানে রিপোর্ট করেছি: list.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html এবং ডেবিয়ান বিটিএস-তে: বাগস.ডিবিয়ান.আর.সি.সি.বিবিন
=

@ ভিনক 17 হ্যাঁ - আমি অনুমান করি যে আমি অবশ্যই এটি করা আবশ্যক বাশ যা অদ্ভুত - কারণ আমি কখনই সেই শেলটি ব্যবহার করি না। অনুমান আমি এই উত্তরের জন্য।
মাইকজার্ভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.