রিমোট এসএসএইচ কমান্ড - ব্যাশ বাইন্ড সতর্কতা: লাইন সম্পাদনা সক্ষম নয়


17

আমি ব্যাশ 4.3.11 (1) ব্যবহার করছি এবং নিম্নলিখিত ইতিহাসের প্লাগইন ইনস্টল করা আছে ( .Bash_it এর মাধ্যমে ):

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'

আমি যখন ইন্টারেক্টিভ সেশনে লগইন করি তখন সব ঠিক থাকে তবে ssh host 'ls -als'উদাহরণস্বরূপ যখন আমি রিমোট কমান্ডগুলি চালনা করি তখন আমি নিম্নলিখিত আউটপুটটি দেখতে পাই:

: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled

আমি যখন echo -e '\0033\0143'প্রতিটি বাইন্ড কলের পরে ইতিহাস প্লাগইনটি সংশোধন করি তখন আমি আর সতর্কতা পাই না তবে আমার কনসোলটি সাফ হয়ে গেছে। একটি বিশাল ত্রুটি নয় তবে এটি দূরবর্তী কমান্ডগুলির জন্য দমন করার একটি ক্লিনার উপায়টি জেনে ভাল লাগবে।

# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
echo -e '\0033\0143'
bind '"^[[B":history-search-forward'
echo -e '\0033\0143'

উত্তর:


28
ssh host 'ls -als'

আপনি যখন ssh কে রিমোট সিস্টেমে কমান্ড চালাতে বলবেন, ssh সাধারণত রিমোট সেশনের জন্য কোনও PTY (সিউডো-টিটিওয়াই) বরাদ্দ করে না। -tএটিতে টিটিটি বরাদ্দ করতে জোর করে আপনি এসএসএস চালাতে পারেন :

ssh -t host 'ls -als'

আপনি যদি সর্বদা এটি টাইপ করতে না চান তবে আপনি এই স্থানীয় লাইনটি ".ssh / config" ফাইলটিতে যোগ করতে পারেন:

RequestTTY yes

পর্যায়ক্রমে, আপনি চলমান কমান্ডগুলি এড়াতে আপনার দূরবর্তী সিস্টেমে ".bashrc" ফাইলটি ঠিক করতে পারেন যা অনুমান করে যে সেশনটি ইন্টারেক্টিভ নয়। একটি উপায় হ'ল আদেশটি একটি পরীক্ষায় বন্ধ করে দেওয়া যে সেশনে একটি টিটিওয়াই রয়েছে:

if [ -t 1 ]
then
    # standard output is a tty
    # do interactive initialization
fi

1
আসলে এই উত্তরটি ভুল, নীচে @ অ্যালেক্সান্ডার-ভোরোবিভের উত্তর দেখুন।
আহমেদ মাসুদ

2

ইন্টারেক্টিভ সেশনটি bindকাজ করার জন্য যথেষ্ট নয় । উদাহরণস্বরূপ ইমাস শেল একটি ইন্টারেক্টিভ সেশন সরবরাহ করে যা if [ -t 1 ]পরীক্ষায় উত্তীর্ণ হয় তবে এতে লাইন সম্পাদনা নেই সুতরাং bindআপনার যে কোনও এস ~/.bashrcসতর্কতা তৈরি করবে। পরিবর্তে, আপনি লাইন সম্পাদনাটি এমন কিছু করে সক্রিয় করা আছে কিনা তা পরীক্ষা করতে পারেন (কোন সহজ / আরও ভাল উপায় আছে?):

if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
  echo "line editing is on"
fi

এটি সঠিক উত্তর হওয়া উচিত
আহমেদ মাসুদ

1
সহজ উপায় ব্যবহার করা হবে[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
আহমেদ মাসুদ

1

বাইন্ড কমান্ডগুলিকে একটি 'if' বিবৃতিতে রাখুন যা বাশ সেশনটি লাইন সম্পাদনার অনুমতি দেয় কিনা তা পরীক্ষা করে:

if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
    bind '"^[[A":history-search-backward'
    bind '"^[[B":history-search-forward'
fi

1

যদি কোনও লাইন সম্পাদনা না হয় তবে এই bindকমান্ডগুলি নিজেরাই নিরীহ। সতর্কতা দমন করুন:

bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward'  2>/dev/null

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


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