নতুন গ্রাফিকাল লগইন প্রতিফলিত করতে স্ক্রিন সেশন পরিবেশ পরিবর্তনশীল আপডেট করা হচ্ছে?


20

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

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


3
আহা! এটি সন্ধান করার জন্য আমি কেবল পুরো পর্দার ম্যানপেজে পোস্ট করেছি:setenv [var [string]] Set the environment variable var to value string. If only var is specified, the user will be prompted to enter a value. If no parameters are specified, the user will be prompted for both variable and value. The environment is inherited by all subsequently forked shells.
রায়ান সি থমসন

এক্স-স্ক্রিন-এ স্যুইচ ব্যবহার করে কেউ সেটেনভকে ডেকে আনতে পারেন। হায়, এটি কেবলমাত্র পরবর্তীকালের কাঁটাচামচগুলিতে কাজ করে, বর্তমান শেলটিতে নয়।
বোরিস বুখ

নোট করুন যে বাইবু এখন স্ক্রিন এবং টিএমউक्स উভয়ের জন্য এর জন্য একটি সমাধান অন্তর্ভুক্ত করেছে।
রায়ান সি। থম্পসন

উত্তর:


8

আপনি screenসেশন থেকে শেল স্ক্রিপ্ট শুরু করতে পারবেন না কারণ এটি পুরানো পরিবেশের উত্তরাধিকারী হবে। পুরানো স্ক্রিন সেশনে নতুন পরিবেশের ভেরিয়েবলগুলি পেতে আপনি তবে আমাদের ফিফো করতে পারেন। আপনি যখন গ্রাফিকাল সেশন শুরু করবেন তখন আপনি সেই ফিফোটি পূরণ করতে পারেন।

#!/bin/bash
FIFO=/tmp/your_variables
[ -e $FIFO ] && cat $FIFO > /dev/null || mkfifo $FIFO

# save number of variables that follow
NVARS=2
echo $NVARS > $FIFO
echo ENV1=sth1 > $FIFO
echo ENV2=sth2 > $FIFO

লগইনে ব্যাকগ্রাউন্ডে সেই স্ক্রিপ্টটি শুরু করুন (এটি কেবল তখনই শেষ হয়ে যাবে যখন সমস্ত ভেরিয়েবলগুলি এটি থেকে পড়ে থাকে)।

আপনি এখন ফিফো থেকে পড়তে পারেন, যেমন আপনার এই ফাংশনটি যুক্ত করুন .bashrc

update_session() {
  FIFO=/tmp/your_variables

  NVAR=$(cat $FIFO)
  for i in $(seq $NVAR); do
    export $(cat $FIFO)
  done
  #delete the pipe, or it will not work next time 
  rm $FIFO
}

যাতে আপনি আপনার পুরানো screenঅধিবেশন করতে পারেন

update_session

উইন্ডোটির প্রধান শেলটি সংশোধন করার জন্য চলমান সেশনে আপনার একবার উইন্ডোতে এটি করার দরকার হবে না?
কোয়াকোট কোয়েসোট

দুর্দান্ত, যদিও ack কোয়াক বলেছেন, আপনার প্রতিটি শেলটি স্বাধীনভাবে আপডেট করার দরকার নেই।
dmckee

ঠিক আছে, আপনার প্রতিটি শেলের মধ্যে এটি করা দরকার screen। এএফআইএকি screenবাইরে থেকে চলমান সেশনগুলির সাথে যোগাযোগের মতো কোনও সকেট বা অনুরূপ প্রকাশ করে না।
বেনজামিন ব্যানিয়ার

@dmckee কিন্তু অবশ্যই যে এর নতুন screen অধিবেশন ইতিমধ্যে সাম্প্রতিক বিভিন্ন পরিবেশের হয়েছে
বেঞ্জামিন Bannier

আমি আপাতত এই উত্তরটি গ্রহণ করার সিদ্ধান্ত নিয়েছি। যদি আমি বাস্তবে এটি বাস্তবায়নের কাছাকাছি যাই, আমি আপডেট করব। তবে আপাতত, এটি তাত্ত্বিকভাবে সম্ভব বলে জেনে উষ্ণ ফাজুক অনুভূতিই যথেষ্ট।
রায়ান সি থম্পসন

2

এটি করার জন্য আমি একটি স্ক্রিপ্ট প্রয়োগ করেছি। আপনি এটি এখানে পেতে পারেন: https://github.com/DarwinAwardWinner/screen-sendenv

screen-sendenv.pyআপনার puttingোকানোর পরে $PATH, আপনি .bashrc এ নিম্নলিখিত স্নিপেট ব্যবহার করতে পারেন:

VARS_TO_UPDATE="DISPLAY DBUS_SESSION_BUS_ADDRESS SESSION_MANAGER GPG_AGENT_INFO"
screen_pushenv () {
  screen-sendenv.py -t screen $VARS_TO_UPDATE
}
tmux_pushenv () {
  screen-sendenv.py -t tmux $VARS_TO_UPDATE
}
screen_pullenv () {
  tempfile=$(mktemp -q) && {
    for var in $VARS_TO_UPDATE; do
      screen sh -c "echo export $var=\$$var >> \"$tempfile\""
    done
    . "$tempfile"
    rm -f "$tempfile"
  }
}
tmux_pullenv () {
  for var in $VARS_TO_UPDATE; do
    expr="$(tmux showenv | grep "^$var=")"
    if [ -n "$expr" ]; then
      export "$expr"
    fi
  done
}

এটি ব্যবহার করতে, আপনার স্ক্রিন সেশনে পুনরায় যুক্ত করতে চালানোর screen_pushenvআগে চালান screen -r। তারপরে, সংযুক্তির পরে screen -r, আপনি আপনার বিদ্যমান শেলগুলির সাথে পরিবেশটি আপডেট করতে পারেন screen_pullenv। Tmux ফাংশনগুলি টিএমউক্সের জন্য একই জিনিসটি সম্পাদন করে, স্ক্রিনের অনুরূপ আরেকটি টার্মিনাল মাল্টিপ্লেক্সার।


বাহ রায়ান, এটি অনেক কোড। পূর্বে গৃহীত উত্তরের সাথে কী ভুল ছিল (এটি অন্তত অনুপ্রেরণামূলক ছিল)?
বেনিয়ামিন ব্যানিয়ার

1
ঠিক আছে, আমি আবিষ্কার করেছি যে স্ক্রিনটি (এবং tmux) একটি "সেটেনভ" কমান্ড রয়েছে যা পর্দার বর্তমান উইন্ডোতে শেল নয়, পর্দার জন্য একটি পরিবেশের পরিবর্তনশীল সেট করে। সুতরাং এর অর্থ হ'ল আপনি আমার স্ক্রিপ্টটি ব্যবহার করার পরে, সেই স্ক্রিন সেশনে নতুনভাবে তৈরি সমস্ত উইন্ডোগুলি তাদের প্রত্যেকটিতে আপডেট স্ক্রিপ্ট না চালিয়ে স্বয়ংক্রিয়ভাবে নতুন পরিবেশ পাবে। অবশ্যই, একটি আপডেট স্ক্রিপ্ট বিদ্যমান শেলগুলি আপডেট করার জন্য এখনও কার্যকর হতে পারে, তবে আপনাকে এটি ফিফো থেকে না পড়ার জন্য পুনর্লিখন করতে হবে, তবে নতুন মানগুলির জন্য নিজেই স্ক্রিন / টিএমউক্স সেশনটি অনুসন্ধান করতে হবে।
রায়ান সি। থম্পসন

কীভাবে স্ক্রীন / tmux সেশন থেকে বর্তমান শেলে ভেরিয়েবল টান দেখতে পারেন এখানে , এ screen_updateএবং tmux_updateফাংশন। আমি এর উত্তর বাই-স্বাধীন সংস্করণ দিয়ে আমার উত্তর আপডেট করব।
রায়ান সি থম্পসন

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

আরে রায়ান, উত্তর দেওয়ার জন্য ধন্যবাদ। আপনি যে উল্লেখ করেছেন এখন setenvআমি দেখতে পাচ্ছি যে এটি আরও ভাল। আপনি যে কোডটি লিঙ্ক করেছেন তা থেকে এটি সুস্পষ্ট ছিল না। আবার ধন্যবাদ!
বেনিয়ামিন বান্নিয়ার

2

আপনি setenvস্ক্রিন প্রক্রিয়ায় ইন্টারেক্টিভভাবে পরিবেশের পরিবর্তনশীল পরিবর্তন করতে কমান্ডটি আবেদন করতে পারেন : Ctrl- A+ :setenv( :একটি স্ক্রিন কমান্ড লিখতে অক্ষরটি নোট করুন )) আপনাকে পরিবেশের পরিবর্তনশীল নাম এবং মান জিজ্ঞাসা করা হবে।

নোট করুন (অন্যান্য উত্তর / মতামত অনুসারে) এটি (পিতামাতাদের) স্ক্রিন প্রক্রিয়া এবং অতএব সদ্য নির্মিত স্ক্রিন সেশনগুলিকে প্রভাবিত করে তবে আপনার বর্তমান স্ক্রিন সেশন বা কোনও বিদ্যমান স্ক্রিন সেশন নয়।

আপনি চাইলে একই সময়ে পরিবেশের পরিবর্তনশীল নাম এবং মান নির্দিষ্ট করতে পারেন: Ctrl- A+ :setenv DISPLAY :100। নতুন স্ক্রিন সেশনের জন্য ": 100" এ DISPLAY সেট করবে।

পরিবেশের পরিবর্তনশীল অপসারণ করতে আপনি 'unsetenv' ব্যবহার করতে পারেন - যেমন Ctrl- A+:unsetenv DISPLAY


0

এটি সম্ভবত একটি সহজ সমাধান (আপনি সিদ্ধান্ত নিন)। গুরুত্বপূর্ণ অংশটি উরফ হওয়া যা savedisplayপ্রতিটি ফাংশনটি প্রতিবার screenকমান্ড চালিত হয়। কমান্ডগুলি স্বয়ংক্রিয়ভাবে চালিত হয় না, তাই ~/.bashrcখুব বিশেষায়িত কিছু পরিবর্তে স্থাপন করা যেতে পারে ~/.ssh/rc

savedisplay() {
    # Write latest bash display to a file, This is used to 
    # update running bash sessions for a "screen -r"
    echo "export DISPLAY=$DISPLAY" > ~/.XDISPLAY
    echo "export XAUTHORITY=$XAUTHORITY" >> ~/.XDISPLAY
    # This will only update the environment for new windows
    screen -X setenv DISPLAY $DISPLAY
    screen -X setenv XAUTHORITY $XAUTHORITY
}

# run this to update env variable in a running session
updatedisplay() {
    source ~/.XDISPLAY 
}

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