අන්තර්ක්රියාකාරී කවචයක් සහ අන්තර්ක්රියාකාරී නොවන කවචයක් අතර මූලික වෙනස මට වැටහේ. නමුත් පුරනය වීමේ කවචය පුරනය නොවන කවචයකින් හරියටම වෙනස් වන්නේ කුමක් ද?
පුරනය නොවන අන්තර්ක්රියාකාරී කවචයක් භාවිතා කිරීම සඳහා ඔබට උදාහරණ ලබා දිය හැකිද ?
අන්තර්ක්රියාකාරී කවචයක් සහ අන්තර්ක්රියාකාරී නොවන කවචයක් අතර මූලික වෙනස මට වැටහේ. නමුත් පුරනය වීමේ කවචය පුරනය නොවන කවචයකින් හරියටම වෙනස් වන්නේ කුමක් ද?
පුරනය නොවන අන්තර්ක්රියාකාරී කවචයක් භාවිතා කිරීම සඳහා ඔබට උදාහරණ ලබා දිය හැකිද ?
Answers:
පිවිසුම් කවචය යනු ඔබ අන්තර්ක්රියාකාරී සැසියක් සඳහා ලොග් වූ විට ඔබේ පරිශීලක හැඳුනුම්පත යටතේ ක්රියාත්මක වන පළමු ක්රියාවලියයි. පුරනය වීමේ ක්රියාවලිය කවචයට සම්මුතියක් සහිත පිවිසුම් කවචයක් ලෙස හැසිරෙන ලෙස පවසයි: සම්මත ෂෙල් ක්රියාත්මක කළ හැකි නම වන පරාමිතිය 0, සාමාන්යයෙන් -
අක්ෂර වින්යාසය සහිතව (උදා: -bash
සාමාන්යයෙන් එය එසේ වනු ඇත bash
. පිවිසුම් කවච සාමාන්යයෙන් ගොනුවක් කියවයි පරිසරය විචල්යයන් සැකසීමට වැනි දේවල්: /etc/profile
හා ~/.profile
සාම්ප්රදායික Bourne shell සඳහා, ~/.bash_profile
මීට අමතරව bash සඳහා † , /etc/zprofile
හා ~/.zprofile
zsh සඳහා † , /etc/csh.login
හා ~/.login
csh සඳහා, ආදිය
ඔබ වෙත කෙටි පුවරුවේ හෝ 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
සහ ~/.zshrc
zsh සඳහා, /etc/csh.cshrc
සහ ~/.cshrc
csh ENV
සඳහා, POSIX / XSI- අනුකූල ෂෙල් සඳහා විචල්යය මඟින් දැක්වෙන ගොනුව , ඩෑෂ්, කේඑස්, සහ බාෂ් වැනි ආයාචනා කරන විට sh
, $ENV
සකසා ඇත්නම් සහ ~/.mkshrc
mksh, ආදිය සඳහා).
කවචයක් එහි විධාන රේඛාවේ ස්ක්රිප්ට් එකක් හෝ විධානයක් ක්රියාත්මක කළ විට එය අන්තර්ක්රියාකාරී නොවන, පිවිසුම් නොවන කවචයකි. එවැනි කවච සෑම විටම ක්රියාත්මක වේ: වැඩසටහනක් වෙනත් වැඩසටහනක් අමතන විට, එය ඇත්ත වශයෙන්ම එම කුඩා වැඩසටහනක් ෂෙල් එකක ධාවනය කර වෙනත් වැඩසටහනක් ක්රියාත්මක කිරීම සාමාන්ය දෙයකි. සමහර ෂෙල් වෙඩි මෙම නඩුවේ ආරම්භක ගොනුවක් කියවයි ( BASH_ENV
විචල්යය මඟින් දැක්වෙන ගොනුව බාෂ් ධාවනය කරයි, zsh ධාවනය /etc/zshenv
සහ ~/.zshenv
), නමුත් මෙය අවදානම් සහගත ය: කවචය සෑම තරාතිරමකම ආයාචනා කළ හැකි අතර ඔබට කළ හැකි කිසිවක් නැති තරම්ය. යමක් කඩන්න.
† මම ටිකක් සරල කරමි, ගෝරි විස්තර සඳහා අත්පොත බලන්න.
bash
අන්තර්ක්රියාකාරී නොවන පිවිසුම් කවචයක් ලෙස ක්රියාත්මක වන්නේ කෙසේදැයි ඔබට උදාහරණයක් දිය හැකිද ?
echo $- | bash -lx
FOO
පරිසර විචල්යයක් නම් (එනම් .profile
අඩංගු වේ export FOO=something
) එය ඇතුළුව සියලුම උපසිරැසි සඳහා ලබා ගත හැකිය foo.sh
. ඔබ වෙනස් කරන්නේ නම් .profile
කිරීමට export FOO=something_else
පසුව ./foo.sh
තවමත් මුද්රණය කරනු ඇත something
. ඔබ විසින් ළහිළහියේ ප්රවිෂ්ට ඉදිරි කාලය දක්වා
ඔබ පිවිසුම් කවචයක සිටී දැයි පැවසීමට:
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 විකල්පය භාවිතා කල හැක. "
පිවිසුම් කවචයක , argv[0][0] == '-'
. මෙය පිවිසුම් කවචයක් බව එය දනී.
සමහර අවස්ථාවල එය එහි "පිවිසුම් කවචය" තත්ත්වය අනුව වෙනස් ලෙස හැසිරේ. උදා: පිවිසුම් කවචයක් නොවන කවචයක්, "ලොග්අවුට්" විධානයක් ක්රියාත්මක නොකරයි.
man bash
අවධාරණයට අනුව , "පුරනය වීමේ කවචය යනු තර්ක විතර්කයේ පළමු අක්ෂරය a -, හෝ --login විකල්පයෙන් ආරම්භ වූ එකක්. "
පිවිසුම් ෂෙල් වර්ගය පරීක්ෂා කිරීම සඳහා තිමෝතිගේ ක්රමවේදය සමඟ ගිලෙස් දුන් විශිෂ්ට පිළිතුර මම විස්තරාත්මකව විස්තර කරමි.
ඔබ ඔබටම දේවල් දැකීමට කැමති නම්, ස්නිපෙට් සහ දර්ශන බෙලෝ උත්සාහ කරන්න.
කවචය (නොවන) අන්තර්ක්රියාකාරීද යන්න පරීක්ෂා කිරීම
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 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 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
වැඩි තොරතුරු නොවන්නේ ඇයි යන මාතෘකාව යටතේ .