නැවත ආරම්භ නොකර / etc / environment නැවත පූරණය කරන්නේ කෙසේද?


169

/etc/environmentවන නිල පද්ධතිය පුළුල් පරිසරය විචල්යයන් සඳහා නිවැරදි තැනක්. නමුත් නැවත ආරම්භ කිරීම හෝ නැවත සකස් කිරීමකින් තොරව මෙම ගොනුවේ පැවරුම් නැවත පූරණය කරන්නේ කෙසේද?

භාවිතා කිරීමට යෝජනා කරන බ්ලොග් සටහන් දුසිම් ගණනක් හැරුණු කොට, ගූගල් මට මෙහි උදව් නොකරයි

source /etc/environment

එය කිසි විටෙකත් ක්‍රියා නොකරනු ඇත, මන්ද /etc/environmentඑය පැවරුම් ලැයිස්තුවක් (පේළියකට එකක්) මිස ක්‍රියාත්මක කළ හැකි ස්ක්‍රිප්ටයක් නොවේ (එබැවින් නැතිවූ exportවිධානයන් /etc/environment...).


12
පද්ධතිමය වශයෙන්, මට කිසිම අදහසක් නැත. වත්මන් ෂෙල් සැසිය සඳහා for line in $( cat /etc/environment ) ; do export $line ; done, ගොනු ආකෘතිය නම් ඔබට භාවිතා කළ හැකිය key=value.
ඩැනියෙල් බෙක්

3
මා නොමැතිව වැඩ කරයි export...
ඉස්කාටා

3
zlzkata: විචල්‍යයක් දැනටමත් අපනයනය කර ඇත්නම්, එය නැවත අපනයනය කිරීම අවශ්‍ය නොවිය යුතුය ... දැනටමත් අපනයනය කර නොමැති නව විචල්‍යයක් එකතු කර ඇත්නම්, exportඅවශ්‍ය වනු ඇත ... (එය නොමැතිව එය සාමාන්‍ය නොවන වත්මන් කවචයේ පරිසර විචල්‍යය, ළමා ක්‍රියාවලීන්හි නොමැත)
ගර්ට් වැන් ඩෙන් බර්ග්

An ඩැනියෙල්බෙක් ඔබට ස්තූතියි..පීඑල්එස් පිළිතුරක් ලෙස ඔබේ අදහස් එක් කරන්න!
ගඩෙල්කරීම්

එය ඩෙබියන් සහ සෙන්ටෝස් මත ද ක්‍රියාත්මක වේද?
මැසිමෝ

Answers:


128

ඔබ වැරදියට වටහාගෙන ඇති එක් දෙයක් /etc/environmentනම් නැවත පූරණය කිරීම සඳහා නැවත පණගැන්වීම අවශ්‍ය වේ. මෙය වැරදිය. ගොනුව කියවන එකම අවස්ථාව වන්නේ ප්‍රවේශවීමේදී , PAM තොගය සක්‍රිය වූ විට - විශේෂයෙන් pam_env.so, ගොනුව කියවන.

පිටවීම සහ නැවත ඇතුල් වීම වෙනස්කම් වලට අදාළ වේ - ඇත්ත වශයෙන්ම ඔබේ සියලු ක්‍රියාදාමයන්ට නව පරිසරය ලැබීමට අවශ්‍ය නම් ඔබ මෙය කළ යුතුය . අනෙක් සියලුම "විසඳුම්" 2 පරිසරය අදාළ කරන්නේ තනි කවච ක්‍රියාවලියට පමණි, නමුත් ඔබ නව පර්යන්ත කවුළු ඇතුළුව GUI හරහා දියත් කරන කිසිවක් සඳහා නොවේ. 1

නමුත්, ඒ සමඟ ඔයා තමයි දඩ නම් - නොමැති exportවිධාන සඳහා වන්දි කළ හැකි set -aහා set +a. කෙසේ වෙතත්, ගොනුව උපුටා දැක්වීම භාවිතා නොකරන බැවින් එය තවමත් දුර්වල ක්‍රමයක් ලෙස පවතී. නමුත් මෙය හොඳින් ක්‍රියාත්මක විය යුතුය:

while read -r env; do export "$env"; done

1 GNOME Session Manager විසින් තමන්ගේම පරිසරය වෙනස් කිරීමට ක්‍රමයක් සපයයි, නමුත් Initializationඅදියර තුළ පමණි :

$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

2 gdb විසඳුමක් නොවේ, නමුත් සමහර විට භාවිතා කළ හැකිය. ඔබ ඔබේ සැසි කළමණාකරු (උදා: ධාවන ක්රියාවලිය එය අනුයුක්ත කිරීමට ඇති gnome-session,) ඔබේ කවුළු කළමණාකරු (උදා: gnome-shellහෝ openbox), ඔබේ කාර්ය තීරුව / පුවරුව නම් (උදා: xfce4-panel), සහ පොදුවේ හැකි දේවල් ක්රියාත්මක කරන බව දෙයක්. එම සෑම ක්‍රියාවලියක් සඳහාම, ඔබ gdbඑයට PID මඟින් ඇමිණිය යුතුය, putenv()භාවිතයෙන් ශ්‍රිතය pකැඳවිය යුතුය, පසුව භාවිතයෙන් වෙන් කරන්න q:

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

නිදොස්කරණය මඟින් ක්‍රියාවලිය නවත්වන බව සලකන්න, එබැවින් ඔබ කවුළු කළමණාකරුවන් සංයුක්ත කිරීමට ඇමිණිය යුත්තේ වෙනත් tty (අතථ්‍ය කොන්සෝලයකින්) හෝ SSH හරහා පමණි, එසේ නොමැතිනම් තිරය කැටි වනු ඇත.

ඊට අමතරව, ඔබ dbus-deemon භාවිතා කරන පරිසරය ද යාවත්කාලීන කළ යුතුය:

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

පැරණි පද්ධති සඳහා:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()

1
-R env කියවන අතරතුර මම පරීක්‍ෂා කළෙමි; අපනයනය කරන්න "$ env"; උබුන්ටු 16.04 හි සිදු කර ඇති අතර එය දෝෂ සහිතය. වැඩි විස්තර සඳහා ඔබ කැමතිද?
ෆ්‍රෑන්ක්

මෙම while readක්රමය සිට කියවන stdin, ඒ නිසා ඔබ බොහෝ විට එය නල දෙයක් (උදා: අවශ්ය cat /etc/environment | while ...). නමුත් මෙය උපුටා දක්වන ලද පරිසර පරිසර ගොනු සමඟ ක්‍රියා නොකරනු ඇත ( key="value")
villasv

ඔබට ස්තුතියි! read -rඩෝකර් සමඟ භාවිතා කරන ලද සාමාන්‍ය "එන්වී ලිපිගොනු" විග්‍රහ කිරීම සඳහා මම ඔබ වැනි අලංකාර විසඳුමක් කාලයක් තිස්සේ සොයමින් සිටියෙමි . මෙහි හිස් රේඛා සහ රේඛා මඟහරින වඩාත් සම්පූර්ණ උදාහරණයකි #(වර්තමානයේ env ලිපිගොනු වල බහුලව දක්නට ලැබෙන පරිදි) ආරම්භ වන අතර රේඛාවක් විකෘති වී ඇත්නම් දෝෂයක් සමඟ පිටවෙයි:while read -r pair; do if [[ $pair == ?* && $pair != \#* ]]; then export "$pair" || exit 2; fi; done < SOME_ENV_FILE
ටොබියා

6

මෙය පිළිගත් පිළිතුර තරම් පුළුල් නොවේ, නමුත් ඔබ ඔබේ /etc/environmentලිපිගොනු වල විචල්‍යයන් උපුටා දක්වා ඇත්නම් පෙර ක්‍රම දෙකම ( export $lineකෙසේ හෝ භාවිතා කරයි ) වැරදී ගොස් ඔබ උපුටා ගත් අගයන් සමඟ අවසන් වේ.

  • විකල්ප 1: තාවකාලික ප්‍රභවයක් සහිත ගොනුවක් සමඟ

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • විකල්ප 2: පේළිගත කිරීම සමඟ for(ස්තූතියි @ ටයිම්-ජෝන්ස්):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done


4
කෙටි: evalsed 's/^/export /' /etc/environment
ආරොන් මැක්මිලින්

2
ඉහත තාවකාලික නොවන ගොනු අනුවාදය:for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
ටිම් ජෝන්ස්

7
ඊටත් වඩා කෙටි: set -a; source /etc/environment; set +a;.
ulidtko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.