පිවිසුම් කවචය සහ පුරනය නොවන ෂෙල් අතර වෙනස?


352

අන්තර්ක්‍රියාකාරී කවචයක් සහ අන්තර්ක්‍රියාකාරී නොවන කවචයක් අතර මූලික වෙනස මට වැටහේ. නමුත් පුරනය වීමේ කවචය පුරනය නොවන කවචයකින් හරියටම වෙනස් වන්නේ කුමක් ද?

පුරනය නොවන අන්තර්ක්‍රියාකාරී කවචයක් භාවිතා කිරීම සඳහා ඔබට උදාහරණ ලබා දිය හැකිද ?


53
" පිවිසුම් සහ පිවිසුම් නොවන කවච වෙන්කර හඳුනා ගැනීමට අප උනන්දු වන්නේ ඇයි ?" එක් එක් කියවන ආරම්භක ලිපිගොනු අනුව, වෙබයේ බොහෝ ස්ථාන දැනටමත් වෙනස්කම් මොනවාදැයි අපට කියයි ; එහෙත් ඔවුන්ගෙන් කිසිවෙකු "ඇයි" යන්න සතුටුදායක සහ ඒත්තු ගැන්වෙන ආකාරයෙන් පිළිතුරු දෙන බවක් නොපෙනේ. උදාහරණ ලෙස එක් හෝ වෙනත් හැසිරීමක් ඔබට අනිවාර්යයෙන්ම අවශ්‍ය නොවන අවස්ථා භාවිතා කරන්න .
කල්

6
Al කල් මෙය වෙනස් ප්‍රශ්නයක් විය යුතුය, මන්ද මෙහි කිසිදු පිළිතුරක් ඇත්ත වශයෙන්ම එය ආවරණය නොකරයි. සංස්කරණය කරන්න: ඇත්තටම, මෙතැන ය: ඇයි පිවිසුම් වැඩි ෂෙල් පිවිසුම් නොවන ෂෙල්? .
ස්කිපි ලෙ ග්‍රෑන්ඩ් ගුරෝ

Answers:


344

පිවිසුම් කවචය යනු ඔබ අන්තර්ක්‍රියාකාරී සැසියක් සඳහා ලොග් වූ විට ඔබේ පරිශීලක හැඳුනුම්පත යටතේ ක්‍රියාත්මක වන පළමු ක්‍රියාවලියයි. පුරනය වීමේ ක්‍රියාවලිය කවචයට සම්මුතියක් සහිත පිවිසුම් කවචයක් ලෙස හැසිරෙන ලෙස පවසයි: සම්මත ෂෙල් ක්‍රියාත්මක කළ හැකි නම වන පරාමිතිය 0, සාමාන්‍යයෙන් -අක්ෂර වින්‍යාසය සහිතව (උදා: -bashසාමාන්‍යයෙන් එය එසේ වනු ඇත bash. පිවිසුම් කවච සාමාන්‍යයෙන් ගොනුවක් කියවයි පරිසරය විචල්යයන් සැකසීමට වැනි දේවල්: /etc/profileහා ~/.profileසාම්ප්රදායික Bourne shell සඳහා, ~/.bash_profileමීට අමතරව bash සඳහා , /etc/zprofileහා ~/.zprofilezsh සඳහා , /etc/csh.loginහා ~/.logincsh සඳහා, ආදිය

ඔබ වෙත කෙටි පුවරුවේ හෝ SSH හරහා, හෝ සමග ලොග් වූ විට su -, ඔබ ලබා අන්තර් පිවිසුම් ෂෙල්. ඔබ චිත්‍රක ප්‍රකාරයට පිවිසෙන විට ( එක්ස් ඩිස්ප්ලේ කළමණාකරුවෙකු මත ), ඔබට පිවිසුම් කවචයක් නොලැබේ, ඒ වෙනුවට ඔබට සැසි කළමනාකරුවෙකු හෝ කවුළු කළමනාකරුවෙකු ලැබේ.

අන්තර්ක්‍රියාකාරී නොවන පිවිසුම් කවචයක් ධාවනය කිරීම දුර්ලභ ය , නමුත් සමහර X සැකසුම් මඟින් ඔබ දර්ශන කළමනාකරුවෙකු සමඟ ලොග් වූ විට පැතිකඩ ලිපිගොනු කියවීමට කටයුතු කරයි. වෙනත් සැකසුම් (මෙම බෙදාහැරීම හා ප්රදර්ශනය කළමනාකරු මත රඳා පවතී) කියවීමට /etc/profileසහ ~/.profileසුවිශේෂව, හෝ ඒවා කියවන්න එපා. ඒකාකාරී පිවිසුම් shell එකක් ලබා ගැනීම තවත් ක්රමයක් මාරාන්තික නොවන සම්මත ආදාන මගින් සම්මත විධාන සමග දුරස්ථව ප්රවිෂ්ට කර ගැනීම සඳහා, වන අතර, උදා: ssh example.com <my-script-which-is-stored-locally(විරුද්ධ ලෙස ssh example.com my-script-which-is-on-the-remote-machine, ඒකාකාරී, පිවිසුම් නොවන ෂෙල් දිවෙන).

පවතින සැසියකදී ඔබ ටර්මිනලයක කවචයක් ආරම්භ කරන විට (තිරය, එක්ස් ටර්මිනලය, ඉමාක්ස් ටර්මිනල් බෆරය, තවත් එකක් ඇතුළත ෂෙල් එකක් ආදිය), ඔබට අන්තර්ක්‍රියාකාරී, පිවිසුම් නොවන කවචයක් ලැබේ. එම කවචය මඟින් ෂෙල් වින්‍යාස ගොනුවක් කියවිය හැකිය ( බාෂ් සඳහා ~/.bashrcආයාචනා කරන ලද bash, /etc/zshrcසහ ~/.zshrczsh සඳහා, /etc/csh.cshrcසහ ~/.cshrccsh ENVසඳහා, POSIX / XSI- අනුකූල ෂෙල් සඳහා විචල්‍යය මඟින් දැක්වෙන ගොනුව , ඩෑෂ්, කේඑස්, සහ බාෂ් වැනි ආයාචනා කරන විට sh, $ENVසකසා ඇත්නම් සහ ~/.mkshrcmksh, ආදිය සඳහා).

කවචයක් එහි විධාන රේඛාවේ ස්ක්‍රිප්ට් එකක් හෝ විධානයක් ක්‍රියාත්මක කළ විට එය අන්තර්ක්‍රියාකාරී නොවන, පිවිසුම් නොවන කවචයකි. එවැනි කවච සෑම විටම ක්‍රියාත්මක වේ: වැඩසටහනක් වෙනත් වැඩසටහනක් අමතන විට, එය ඇත්ත වශයෙන්ම එම කුඩා වැඩසටහනක් ෂෙල් එකක ධාවනය කර වෙනත් වැඩසටහනක් ක්‍රියාත්මක කිරීම සාමාන්‍ය දෙයකි. සමහර ෂෙල් වෙඩි මෙම නඩුවේ ආරම්භක ගොනුවක් කියවයි ( BASH_ENVවිචල්‍යය මඟින් දැක්වෙන ගොනුව බාෂ් ධාවනය කරයි, zsh ධාවනය /etc/zshenvසහ ~/.zshenv), නමුත් මෙය අවදානම් සහගත ය: කවචය සෑම තරාතිරමකම ආයාචනා කළ හැකි අතර ඔබට කළ හැකි කිසිවක් නැති තරම්ය. යමක් කඩන්න.

මම ටිකක් සරල කරමි, ගෝරි විස්තර සඳහා අත්පොත බලන්න.


2
bashඅන්තර්ක්‍රියාකාරී නොවන පිවිසුම් කවචයක් ලෙස ක්‍රියාත්මක වන්නේ කෙසේදැයි ඔබට උදාහරණයක් දිය හැකිද ?
Piotr Dobrogost


1
පොදුවේ මෙය සත්‍යයක් දැයි මම නොදනිමි, නමුත් මම නව පර්යන්තයක් විවෘත කරන විට (පෙරනිමි සැකසුම් භාවිතා කරමින් ඔක්ස් මත), මම කිසි විටෙකත් මගේ පරිශීලක නාමය හෝ මුරපදය ටයිප් නොකළද මට පිවිසුම් කවචයක් ලැබේ.
කෙවින් වීලර්

4
EKevinWheeler OSX හි පෙරනිමියෙන් ටර්මිනල් යෙදුම පිවිසුම් කවචයක් ධාවනය කරයි. (මා පැහැදිලි කරන පරිදි, කවචය ආරම්භ කරන වැඩසටහන මඟින් කවචය පිවිසුම් කවචයක් ලෙස ක්‍රියා කරන්නේද යන්න තීරණය කරයි.) එය සාමාන්‍ය දේවල් නොවේ.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

2
@IAmJulianAcosta FOOපරිසර විචල්‍යයක් නම් (එනම් .profileඅඩංගු වේ export FOO=something) එය ඇතුළුව සියලුම උපසිරැසි සඳහා ලබා ගත හැකිය foo.sh. ඔබ වෙනස් කරන්නේ නම් .profileකිරීමට export FOO=something_elseපසුව ./foo.shතවමත් මුද්රණය කරනු ඇත something. ඔබ විසින් ළහිළහියේ ප්රවිෂ්ට ඉදිරි කාලය දක්වා
ගිලෙස් 'SO- නැවතුම් වීම නපුර'

54

ඔබ පිවිසුම් කවචයක සිටී දැයි පැවසීමට:

prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.

prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.

Bash හි, ඔබට මෙයද භාවිතා කළ හැකිය shopt login_shell:

prompt> shopt login_shell
login_shell     off

(හෝ onපිවිසුම් කවචයක).

තොරතුරු සොයාගත හැකිය man bash(ආයාචනය සෙවීම). මෙන්න උපුටා ගැනීමකි:

පුරනය වීමේ කවචය යනු තර්ක ශුන්‍යයේ පළමු අක්‍ෂරය a -, හෝ --login විකල්පයෙන් ආරම්භ වූ එකකි.

ඔබට මෙය ඔබම පරීක්ෂා කළ හැකිය. ඔබ SSH කරන ඕනෑම වේලාවක ඔබ පිවිසුම් කවචයක් භාවිතා කරයි. උදාහරණයක් වශයෙන්:

prompt> ssh user@localhost
user@localhost's password:
prompt> echo $0
-bash

පුරනය වීමේ කවචයක් භාවිතා කිරීමේ වැදගත්කම නම්, ඕනෑම සැකසුම් ක්‍රියාත්මක /home/user/.bash_profileවනු ඇත. ඔබ උනන්දුවක් දක්වන්නේ නම් මෙන්න තවත් තොරතුරු ටිකක් (වෙතින් man bash)

"බාෂ් අන්තර්ක්‍රියාකාරී පිවිසුම් කවචයක් ලෙස හෝ --login විකල්පය සමඟ අන්තර්ක්‍රියාකාරී නොවන කවචයක් ලෙස ආයාචනා කරන විට, එය මුලින්ම එම ගොනුව තිබේ නම් / etc / profile ගොනුවේ විධාන කියවා ක්‍රියාත්මක කරයි. එම ගොනුව කියවීමෙන් පසු එය සඳහා පෙනුම ~/.bash_profile, ~/.bash_loginහා ~/.profileපවතී, කියවිය හැකි බව පළමු එක් සිට, ඒ සඳහා, සහ ලිවීම් හා ඉටු කරන විධාන. ෂෙල් මේ හැසිරීම තහනම් කරීම ආරම්භ කරන විට මෙම --noprofile විකල්පය භාවිතා කල හැක. "


23

පිවිසුම් කවචයක , argv[0][0] == '-'. මෙය පිවිසුම් කවචයක් බව එය දනී.

සමහර අවස්ථාවල එය එහි "පිවිසුම් කවචය" තත්ත්වය අනුව වෙනස් ලෙස හැසිරේ. උදා: පිවිසුම් කවචයක් නොවන කවචයක්, "ලොග්අවුට්" විධානයක් ක්‍රියාත්මක නොකරයි.


5
man bashඅවධාරණයට අනුව , "පුරනය වීමේ කවචය යනු තර්ක විතර්කයේ පළමු අක්‍ෂරය a -, හෝ --login විකල්පයෙන් ආරම්භ වූ එකක්. "
වයිල්ඩ්කාඩ්

18

GUI හි නව පර්යන්තයකින් ආරම්භ කරන ලද කවචයක් අන්තර්ක්‍රියාකාරී නොවන පිවිසුම් කවචයක් වනු ඇත. එය ඔබේ .bashrc ප්‍රභවයක් වනු ඇත, නමුත් ඔබේ .profile නොවේ.


6

පිවිසුම් ෂෙල් වර්ගය පරීක්ෂා කිරීම සඳහා තිමෝතිගේ ක්‍රමවේදය සමඟ ගිලෙස් දුන් විශිෂ්ට පිළිතුර මම විස්තරාත්මකව විස්තර කරමි.

ඔබ ඔබටම දේවල් දැකීමට කැමති නම්, ස්නිපෙට් සහ දර්ශන බෙලෝ උත්සාහ කරන්න.

කවචය (නොවන) අන්තර්ක්‍රියාකාරීද යන්න පරීක්ෂා කිරීම

if tty -s; then echo 'This is interactive shell.'; else echo 'This is non-interactive shell.'; fi

කවචය (නොවන) පිවිසුමක් දැයි පරීක්ෂා කිරීම

ප්‍රතිදානය echo $0ආරම්භ වන්නේ නම් -, එය පිවිසුම් කවචය ( echo $0ප්‍රතිදාන උදාහරණය :) -bash. එසේ නොමැති නම් එය පුරනය නොවන කවචය ( echo $0ප්‍රතිදාන උදාහරණය :) bash.

if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "This is login shell."; else echo "This is non-login shell."; fi;

තොරතුරු දෙකම එකවර ලබා ගැනීම සඳහා ඉහත දෙක ඒකාබද්ධ කරමු:

THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; 
THIS_SHELL_LOGIN_TYPE='non-login'; 
if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; 
if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

සිදුවීම්:

විශේෂ විකල්ප නොමැතිව සාමාන්‍ය SSH සැසිය

ssh ubuntu@34.247.105.87
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

ubuntu@ip-172-31-0-70:~$ THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_LOGIN_TYPE='non-login';
ubuntu@ip-172-31-0-70:~$ if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
ubuntu@ip-172-31-0-70:~$ echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

interactive/login

ස්ක්‍රිප්ට් ධාවනය කිරීම හෝ නව කවචය හරහා පැහැදිලිව ක්‍රියාත්මක කිරීම

ubuntu@ip-172-31-0-70:~$  bash -c 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; 
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

දේශීය ස්ක්‍රිප්ට් දුරස්ථව ධාවනය කිරීම

ssh ubuntu@34.247.105.87 < checkmy.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

non-interactive/login

දුරස්ථව ssh හරහා විධානයක් ක්‍රියාත්මක කිරීම

ssh ubuntu@34.247.105.87 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

non-interactive/non-login

-tස්විචය සමඟ දුරස්ථව ssh හරහා විධානයක් ධාවනය කිරීම

-tස්විචය භාවිතා කරමින් ssh හරහා දුරස්ථව විධානය ක්‍රියාත්මක කිරීමට අවශ්‍ය විට ඔබට පැහැදිලිවම අන්තර්ක්‍රියාකාරී කවචයක් ඉල්ලා සිටිය හැකිය.

ssh ubuntu@34.247.105.87 -t 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

සටහන: දුරස්ථව විධානය ක්‍රියාත්මක කිරීම මෙහිlogin shell වැඩි තොරතුරු නොවන්නේ ඇයි යන මාතෘකාව යටතේ .

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.