ඔබට කවදාවත් ඒ ගැන දැන ගැනීමට අවශ්ය නොවනු ඇතැයි ඔබ සිතූ සියල්ල මෙන්න:
සාරාංශය
බෝර්න් වැනි ෂෙල් ස්ක්රිප්ට් එකක ක්රියාත්මක කළ හැකි අයගේ මාර්ග නාමය ලබා ගැනීම සඳහා (අවවාද කිහිපයක් තිබේ; පහත බලන්න):
ls=$(command -v ls)
දී ඇති විධානයක් තිබේදැයි සොයා බැලීමට:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
අන්තර්ක්රියාකාරී බෝර්න් වැනි කවචයක විගසම:
type ls
මෙම whichවිධානය සී-ෂෙල් වෙතින් බිඳුණු උරුමයක් වන අතර එය බෝර්න් වැනි ෂෙල් වෙඩි තුළ පමණක් ඉතිරි වේ.
නඩු භාවිතා කරන්න
ස්ක්රිප්ට් එකක කොටසක් ලෙස හෝ අන්තර්ක්රියාකාරී ලෙස ෂෙල් විමසුමේදී එම තොරතුරු සෙවීම අතර වෙනසක් ඇත.
ෂෙල් විමසුමේදී, සාමාන්ය භාවිත අවස්ථාව මෙයයි: මෙම විධානය අමුතු ලෙස හැසිරේ, මම නිවැරදි එක භාවිතා කරනවාද? මා ටයිප් කරන විට හරියටම සිදු වූයේ mycmdකුමක්ද? එය කුමක්දැයි මට තවදුරටත් සොයා බැලිය හැකිද?
එවැනි අවස්ථාවකදී, ඔබ සැබවින්ම විධානය ක්රියාත්මක නොකර විධානය ඉල්ලා සිටින විට ඔබේ කවචය කරන්නේ කුමක්දැයි දැන ගැනීමට ඔබට අවශ්යය.
ෂෙල් ස්ක්රිප්ට් වල එය තරමක් වෙනස් වේ. ෂෙල් ස්ක්රිප්ට් එකක ඔබට අවශ්ය වන්නේ එය ක්රියාත්මක කරන්නේ නම් කොහේද හෝ කුමක් ද යන්න දැන ගැනීමට ඔබට අවශ්ය නැත. සාමාන්යයෙන්, ඔබට දැන ගැනීමට අවශ්ය වන්නේ ක්රියාත්මක කළ හැකි මාර්ගයයි, එබැවින් ඔබට එයින් වැඩි තොරතුරු ලබා ගත හැකිය (ඊට සාපේක්ෂව වෙනත් ගොනුවකට යන මාර්ගය වැනි, හෝ එම මාර්ගයේ ක්රියාත්මක කළ හැකි ගොනුවේ අන්තර්ගතයෙන් තොරතුරු කියවන්න).
අනොන්ය, ඔබ ගැන දැන ගැනීමට අවශ්ය විය හැක සියලු වන my-cmdනිසා කලාතුරකින්, ස්ක්රිප්ට්, පද්ධතිය මත ලබා ගත විධාන.
පවතින බොහෝ මෙවලම් (බොහෝ විට සිදු වන පරිදි) අන්තර්ක්රියාකාරී ලෙස භාවිතා කිරීමට නිර්මාණය කර ඇත.
ඉතිහාසය
මුලින් ඉතිහාසය ටිකක්.
70 දශකයේ අග භාගය වන තුරුම මුල් යුනික්ස් ෂෙල් වෙඩි වල ක්රියාකාරීත්වයක් හෝ අන්වර්ථ නාමයක් නොතිබුණි. සාම්ප්රදායිකව ක්රියාත්මක කළ හැකි දෑ සොයා බැලීම පමණි $PATH. csh1978 දී පමණ අන්වර්ථ නාමයන් හඳුන්වා දෙන ලදි ( cshප්රථම වරට 1979 මැයි මාසයේදී නිකුත් කරන 2BSDලදි), තවද .cshrcපරිශීලකයන්ට කවචය රිසිකරණය කිරීම සඳහා සැකසීම (සෑම කවචයක්ම, ස්ක්රිප්ට් මෙන් අන්තර්ක්රියාකාරී නොවන විට පවා cshකියවන පරිදි .cshrc).
බෝර්න් කවචය ප්රථම වරට යුනික්ස් වී 7 හි 1979 දී නිකුත් කරන ලද අතර, ක්රියාකාරී සහය එකතු කරනු ලැබුවේ බොහෝ කලකට පසුවය (1984 එස්වීආර් 2 හි), කෙසේ වෙතත්, එය කිසි විටෙකත් කිසියම් rcගොනුවක් නොතිබුණි (එනම් .profileඔබේ පරිසරය වින්යාස කිරීම මිස ෂෙල් එකකට නොව ).
csh බෝර්න් කවචයට වඩා බොහෝ ජනප්රිය විය (එය බෝර්න් කවචයට වඩා නරක වාක්ය ඛණ්ඩයක් තිබුණද) එය අන්තර්ක්රියාකාරී භාවිතය සඳහා වඩාත් පහසු සහ ලස්සන අංග රාශියක් එක් කරයි.
දී 3BSD(1980), වන whichcsh තිර රචනය සඳහා එක් කරන ලදී cshඋදව් කිරීමට භාවිතා කරන්නන්ගෙන් ක්රියාත්මක හඳුනා, සහ එය ඔබ සොයා ගත හැකි ඉතා බැරෑරුම් කටයුක්තකි වෙනස් ස්ක්රිප්ට් whichබොහෝ වාණිජ Unices අද කාලයේ (Solaris, HP / UX, AIX හෝ Tru64 වැනි) මත.
එම ස්ක්රිප්ට් මඟින් පරිශීලකයාගේ ~/.cshrc(සියලු cshස්ක්රිප්ට් භාවිතා නොකරන්නේ නම් csh -f) කියවන අතර , ලබා දී ඇති විධාන නාමයන් අන්වර්ථ ලැයිස්තුවේ සහ $path( cshපදනම් කරගෙන පවත්වා ගෙන යන අරාව ) සොයා බලයි $PATH.
මෙන්න ඔබ යන්න, whichඑකල වඩාත්ම ජනප්රිය කවචය සඳහා පළමු තැනට පැමිණියේය ( csh90 දශකයේ මැද භාගය වන තුරුම එය තවමත් ජනප්රිය විය), එය පොත් වල ලේඛනගත වීමට ප්රධාන හේතුව වන අතර එය තවමත් බහුලව භාවිතා වේ.
cshපරිශීලකයෙකු සඳහා වුවද , එම whichcsh ස්ක්රිප්ට් මඟින් ඔබට නිවැරදි තොරතුරු ලබා නොදෙන බව සලකන්න. එය අර්ථ දක්වා ඇති අන්වර්ථ නාමයන් ලබා ගනී, ~/.cshrcඔබ පසුව විමසුමේදී හෝ sourceවෙනත් cshගොනුවක් ඇතුළත් කිරීමෙන් නිර්වචනය කර ඇති ඒවා නොව , (එය හොඳ අදහසක් නොවනු ඇත), PATHනැවත අර්ථ දැක්විය හැකිය ~/.cshrc.
whichබෝර්න් කවචයකින් එම විධානය ක්රියාත්මක කිරීමෙන් ඔබගේ අර්ථ දක්වා ඇති අන්වර්ථ නාමයන් සොයා බලනු ඇත ~/.cshrc, නමුත් ඔබ භාවිතා නොකරන නිසා එකක් නොමැති නම් csh, එය තවමත් ඔබට නිවැරදි පිළිතුර ලබා දෙනු ඇත.
බිල්ඩින් typeවිධානය සමඟ SVR2 හි 1984 වන තෙක් බෝර්න් කවචයට සමාන ක්රියාකාරීත්වයක් එක් නොවීය . එය ගොඩනඟා ඇති බව (බාහිර පිටපතකට වඩා වෙනස්ව) එයින් අදහස් කරන්නේ එය ඔබට කවචයේ අභ්යන්තරයට ප්රවේශය ඇති බැවින් ඔබට නිවැරදි තොරතුරු (යම් දුරකට) ලබා දිය හැකි බවයි.
ආරම්භක typeවිධානය whichස්ක්රිප්ටයට සමාන ගැටලුවකින් පීඩා වින්දා, එය විධානය සොයාගත නොහැකි නම් එය අසාර්ථක පිටවීමේ තත්වයක් ලබා නොදේ. එසේම, ක්රියාත්මක කළ හැකි දේ සඳහා, ඊට ප්රතිවිරුද්ධව which, එය ස්ක්රිප්ට් වල භාවිතා කිරීම අඩු පහසු කරවන දෙයක් ls is /bin/lsවෙනුවට ප්රතිදානය /bin/lsකරයි.
යුනික්ස් අනුවාදය 8 හි (වනයේ නිකුත් කර නැත) බෝර්න් කවචය එහි typeබිල්ඩින් ලෙස නම් කර whatisතිබේ. හා Plan9 (Unix වල වරක්-කිරීමට විය අනුප්රාප්තිකයා) ෂෙල් rc(සහ වැනි සිය ව්යුත්පන්න akangaහා es) ඇති whatisමෙන්ම.
80 දශකයේ මැද භාගයේ දී සංවර්ධනය කරන ලද නමුත් 1988 ට පෙර පුළුල් ලෙස ලබා ගත නොහැකි වූ කෝන් ෂෙල් (POSIX sh අර්ථ දැක්වීම පදනම් කරගත් උප කුලකයක් csh) බෝර්න් කවචයට ඉහළින් බොහෝ විශේෂාංග (රේඛීය සංස්කාරක, අන්වර්ථ ...) එකතු කළේය. . එය ස්වකීය whenceබිල්ඩින් එකක් එකතු කර typeඇති අතර (ඊට අමතරව ) විකල්ප කිහිපයක් ගෙන ඇත ( සමාන වාචික ප්රතිදානය -vසැපයීමට typeසහ -pක්රියාත්මක කළ හැකි දේ සඳහා පමණක් බැලීමට (අන්වර්ථ / කාර්යයන් නොවේ ...)).
ඒටී ඇන්ඩ් ටී සහ බර්ක්ලි අතර ප්රකාශන හිමිකම් ගැටළු සම්බන්ධයෙන් ඇති වූ නොසන්සුන්තාවයට සමගාමීව, 80 දශකයේ අග භාගයේ 90 දශකයේ මුල් භාගයේදී නිදහස් මෘදුකාංග ෂෙල් ක්රියාත්මක කිරීම් කිහිපයක් එළිදැක්විණි. සියලුම ඇල්ම්ක්විස්ට් කවචය (අළු, බීඑස්ඩී වල බෝර්න් කවචය වෙනුවට), ksh (pdksh), bash( එෆ්එස්එෆ් අනුග්රහය දක්වන ) පොදු වසම ක්රියාත්මක කිරීම zsh1989 සහ 1991 අතර කාලය තුළ එළියට පැමිණියේය.
Ash ෂ්, බෝර්න් කවචය වෙනුවට ආදේශකයක් ලෙස අදහස් කළද typeබොහෝ කලකට පසුව (නෙට්බීඑස්ඩී 1.3 සහ ෆ්රීබීඑස්ඩී 2.3) බිල්ඩින් එකක් නොතිබුණි hash -v. OSF / 1 /bin/shහි typeබිල්ඩින් එකක් තිබූ අතර එය සෑම විටම OSF / 1 v3.x දක්වා 0 ක් ආපසු ලබා දුන්නේය. bashඑකතු නොකළ whenceනමුත් මාර්ගය මුද්රණය කිරීමට ( සමාන වනු ඇත ) සහ ගැලපෙන සියලු විධානයන් වාර්තා කිරීමට -pවිකල්පයක් එක් කළේය . කළ builtin හා එකතු වගේ වැඩ විධාන ගේ . ඒවා සියල්ලම තිබේ.typetype -pwhence -p-atcshwhichwherebashtype -azsh
මෙම fishෂෙල් (2005) සතුව typeශ්රිතයක් ලෙස ක්රියාත්මක විධාන.
මේ අතර whichසීඑස් ස්ක්රිප්ට් නෙට්බීඑස්ඩී වෙතින් ඉවත් කරන ලදි (එය ටීසීඑස් වලින් සාදා ඇති නිසා සහ වෙනත් ෂෙල් වෙඩි වල එතරම් භාවිතයට නොගත් නිසා), සහ එකතු කරන ලද ක්රියාකාරිත්වය whereis(ආයාචනා කරන whichවිට whereisහැසිරෙන්නේ whichඑය ක්රියාත්මක කළ හැකි දෑ පමණක් හැරෙන්නට හැර $PATH). OpenBSD සහ FreeBSD හි, whichC හි ලියා ඇති එකක් ලෙස වෙනස් කරන ලද අතර එය විධාන $PATHපමණක් පෙනේ.
ක්රියාත්මක කිරීම
whichවිවිධ වාක්ය ඛණ්ඩ සහ හැසිරීම් සහිත විවිධ ඒකක මත විධානයක් ක්රියාත්මක කිරීම දුසිම් ගණනක් ඇත .
ලිනක්ස් හි (බිල්ඩින් tcshසහ ඇතුළත zsh) අපට ක්රියාත්මක කිරීම් කිහිපයක් හමු වේ. නිදසුනක් ලෙස මෑත ඩේබියන් පද්ධති වල, එය විධාන සොයන සරල POSIX shell විධානාවලියකි $PATH.
busyboxwhichවිධානයක් ද ඇත .
ඒ නිසා එය GNU whichබොහෝ විට අධිකතර එකක් වන. එය whichcsh ස්ක්රිප්ට් වෙනත් ෂෙල් වෙඩි වලට විස්තාරණය කිරීමට උත්සාහ කරයි : ඔබේ අන්වර්ථ නාම සහ ක්රියාකාරකම් මොනවාදැයි ඔබට එය පැවසිය හැකි අතර එමඟින් ඔබට වඩා හොඳ පිළිතුරක් ලබා දිය හැකිය (තවද සමහර ලිනක්ස් බෙදාහැරීම් ඒ සඳහා ගෝලීය අන්වර්ථ නාම කිහිපයක් සකස් කර ඇති බව මම විශ්වාස කරමි bash) .
zshක්රියාත්මක කළ හැකි මාර්ගයට ව්යාප්ත කිරීම සඳහා ක්රියාකරුවන් දෙදෙනෙකු ඇත : = ගොනු නාම පුළුල් කිරීමේ ක්රියාකරු සහ :cඉතිහාසය පුළුල් කිරීමේ විකරණකාරකය (මෙහි පරාමිති ප්රසාරණයට අදාළ වේ ):
$ print -r -- =ls
/bin/ls
$ cmd=ls; print -r -- $cmd:c
/bin/ls
zsh, zsh/parametersමොඩියුලයේ විධාන හැෂ් වගුව commandsසහායක අරාව ලෙසද කරයි :
$ print -r -- $commands[ls]
/bin/ls
මෙම whatis(යුනික්ස් V8 Bourne shell සඳහා සැලසුම් 9 දී එක් හැර උපයෝගිතා rc/ esපමණක් (මිනිසා පිටුව සාරාංශයක් පහත 'බව පටන් ගමු කියලා දත්ත සමුදාය, greps) ප්රලේඛනය සඳහා නොවන නිසා) ඇත්තටම සම්බන්ධ නැත.
whereisද එක් කරන ලදී 3BSDඅවස්ථාවේ දී ම whichඑය ලියන ලද්දේ වුව Cනැහැ, cshහා, ක්රියාවෙහි යෙදවිය එම අවස්ථාවේ දී විමසුම් සඳහා භාවිතා වන අතර, මිනිසා, පිටු හා මූලාශ්රය නමුත් වත්මන් පරිසරය මත පදනම්. ඉතින් නැවතත්, එය වෙනස් අවශ්යතාවයකට පිළිතුරු සපයයි.
දැන්, සම්මත පෙරමුණේ, POSIX විසින් command -vසහ -Vවිධාන නියම කරයි (POSIX.2008 වන තෙක් විකල්පයක් විය). යුනික්ස් typeවිධානය නියම කරයි (විකල්පයක් නැත). එච්චරයි ( where, which, whenceඕනෑම සම්මත හි නිශ්චිතව දක්වා නොමැත)
සමහර අනුවාදයන් දක්වා, typeසහ command -vලිනක්ස් ස්ටෑන්ඩර්ඩ් බේස් පිරිවිතරයේ විකල්පයක් වූ අතර, උදාහරණයක් ලෙස සමහර පැරණි අනුවාදයන් posh( pdkshදෙකම පදනම් කරගෙන වුවද ) නොතිබුණේ මන්ද යන්න පැහැදිලි කරයි. command -vසමහර බෝර්න් ෂෙල් ක්රියාත්මක කිරීම් වලටද (සොලාරිස් වැනි) එකතු කරන ලදි.
අද තත්වය
වර්තමානයේ තත්වය එය වන typeඅතර command -vඑය බෝර්න් වැනි සියලුම ෂෙල් වෙඩි වල සර්වසම්පූර්ණ වේ (ar ජාර්නෝ විසින් සටහන් කර ඇති පරිදි, පොසික්ස් bashමාදිලියේ නොමැති විට හෝ පහත දැක්වෙන ඇල්ම්ක්විස්ට් කවචයෙන් සමහර අදහස් දැක්වීම් වලදී අවවාදය / දෝෂය සටහන් කරන්න). tcshඔබට භාවිතා කිරීමට අවශ්ය එකම කවචය which(එහි නොමැති typeනිසා සහ whichගොඩනගා ඇති බැවින්).
වඩා වෙනත් කවච tcshහා zsh, whichඔබ අපගේ ඕනෑම බව එම නම කිසිදු හෙවත් හෝ කාර්යය තියෙනවා තාක් කල් ලෙස ක්රියාත්මක ලබා මාවත කියන්න පුළුවන් ~/.cshrc, ~/.bashrcහෝ ඕනෑම ෂෙල් ආරම්භක ගොනු සහ ඔබ අර්ථ නැහැ $PATHඔබේ ~/.cshrc. ඔබට ඒ සඳහා අන්වර්ථයක් හෝ ශ්රිතයක් අර්ථ දක්වා ඇත්නම්, එය ඔබට ඒ ගැන නොකියයි හෝ නොකියයි, නැතහොත් වැරදි දේ ඔබට කියනු ඇත.
ලබා දී ඇති නමකින් ඔබට සියලු විධාන ගැන දැන ගැනීමට අවශ්ය නම්, අතේ ගෙන යා හැකි කිසිවක් නොමැත. ඔබ භාවිතා කරනවා whereදී tcshහෝ zsh, type -aදී bashහෝ zsh, whence -aksh93 හා වෙනත් ෂෙල් වෙඩි දී, ඔබ භාවිතා කළ හැකිය typeසංයෝජනය which -aවැඩ හැකි.
නිර්දේශ
ක්රියාත්මක කළ හැකි මාර්ගයක් ලබා ගැනීම
දැන්, ස්ක්රිප්ට් එකක ක්රියාත්මක කළ හැකි අයගේ මාර්ග නාමය ලබා ගැනීම සඳහා, අවවාද කිහිපයක් තිබේ:
ls=$(command -v ls)
එය කිරීමට සම්මත ක්රමය වනු ඇත.
කෙසේ වෙතත් ගැටළු කිහිපයක් තිබේ:
- එය ක්රියාත්මක නොකර ක්රියාත්මක කළ හැකි මාර්ගය දැනගත නොහැක. සියලු
type, which, command -v... මාර්ගය සොයා ගැනීමට සියලු භාවිතය ස්වතෝන්වේෂණ. ඒවා $PATHසංරචක හරහා ලූප වන අතර ඔබට අවසර ලබා දී ඇති පළමු නාමාවලි නොවන ගොනුව සොයා ගනී. කෙසේ වෙතත්, කවචය මත පදනම්ව, විධානය ක්රියාත්මක කිරීමේදී, ඒවායින් බොහොමයක් (බෝර්න්, ඒටී ඇන්ඩ් ටී කේඑස්, zsh, අළු ...) පද්ධති ඇමතුම දෝෂයක් සමඟ නැවත නොපැමිණෙන $PATHතෙක් ඒවා ක්රියාත්මක කරනු ඇත. execve. උදාහරණයක් ලෙස $PATHඅඩංගු නම් /foo:/barසහ ඔබට ක්රියාත්මක කිරීමට අවශ්ය නම් ls, ඔවුන් පළමුව ක්රියාත්මක කිරීමට උත්සාහ කරයි /foo/lsහෝ එය අසමත් වුවහොත් /bar/ls. දැන් ක්රියාත්මක කිරීම/foo/lsඔබට ක්රියාත්මක කිරීමේ අවසරයක් නොමැති නිසා පමණක් නොව වෙනත් බොහෝ හේතු නිසා එය වලංගු ක්රියාත්මක කළ නොහැකි බැවින් අසමත් විය හැකිය. ඔබට ක්රියාත්මක කිරීමේ අවසරයක් තිබේ නම් command -v lsවාර්තා කරනු ඇත , නමුත් වලංගු ක්රියාත්මක කළ නොහැකි නම් ධාවනය සැබවින්ම ක්රියාත්මක වේ./foo/ls/foo/lsls/bar/ls/foo/ls
- නම්
fooවූ builtin හෝ කාර්යය සඳහා ෙහෝ හෙවත්, වන command -v fooප්රතිලාභ foo. වැනි ෂෙල් වෙඩි සමඟ ash, pdkshහෝ zsh, හිස් නූල ඇතුළත් fooනම් එය නැවත පැමිණිය $PATHහැකි fooඅතර වත්මන් ඩිරෙක්ටරියේ ක්රියාත්මක කළ හැකි ගොනුවක් තිබේ. ඔබට එය සැලකිල්ලට ගත යුතු අවස්ථා කිහිපයක් තිබේ. නිදසුනක් ලෙස මතක තබා ගන්න, බිල්ඩින් ලැයිස්තුව ෂෙල් ක්රියාත්මක කිරීම සමඟ වෙනස් වේ (නිදසුනක් ලෙස, mountසමහර විට කාර්යබහුල පෙට්ටිය සඳහා ගොඩනගා ඇත sh), උදාහරණයක් ලෙස bashපරිසරයෙන් කාර්යයන් ලබා ගත හැකිය.
$PATHසාපේක්ෂ මාර්ග සංරචක අඩංගු නම් (සාමාන්යයෙන් .හෝ හිස් නාමය දෙකම වර්තමාන නාමාවලියට යොමු වන නමුත් ඕනෑම දෙයක් විය හැකිය), කවචය මත පදනම්ව, command -v cmdනිරපේක්ෂ මාර්ගයක් ප්රතිදානය නොකරනු ඇත. එබැවින් ඔබ ධාවනය කරන වේලාවේදී ඔබ ලබාගත් මාර්ගය වෙනත් command -vතැනකින් පසු වලංගු cdනොවේ.
- පෞරාණික: මෙම ksh93 ෂෙල් සමග, නම්
/opt/ast/binඔබ තුළ (එම නිශ්චිත වන්න විවිධ පද්ධති මම විශ්වාස මත වෙනස් විය හැක නමුත්) $PATH, ksh93 කිහිපයක් වැඩිපුර builtins ලබා ගත හැකි (කරන්නෙමි chmod, cmp, cat...), නමුත් command -v chmodආපසු /opt/ast/bin/chmodපවා ඒ මාවතේ පිනිස මෙයින් 'නම් නොපවතී.
විධානයක් තිබේද යන්න තීරණය කිරීම
දී ඇති විධානයක් ප්රමිතිගතව තිබේදැයි සොයා බැලීමට ඔබට මෙය කළ හැකිය:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
යමෙකුට භාවිතා කිරීමට අවශ්ය විය හැකි තැන which
(t)csh
ඇතුළත cshසහ tcsh, ඔබට වැඩි තේරීමක් නැත. දී tcsh, ලෙස හොඳයි බව whichbuiltin වේ. තුළ csh, එය පද්ධති whichවිධානය වනු ඇත , එය අවස්ථා කිහිපයකදී ඔබට අවශ්ය දේ නොකරනු ඇත.
සමහර කවච වල පමණක් විධාන සොයා ගන්න
එය භාවිතා කිරීම අර්ථවත් විය හැකි අවස්ථාවක් whichනම්, ඔබට විධානයක මාර්ගය දැන ගැනීමට අවශ්ය නම්, විභව ෂෙල් බිල්ඩින් හෝ කාර්යයන් නොසලකා හැරීම bash, csh(නොවේ tcsh) dash, හෝ Bourneෂෙල් ස්ක්රිප්ට්, එනම් නැති whence -p(වැනි kshහෝ zsh) ෂෙල් වෙඩි , command -ev(වැනි yash), whatis -p( rc, akanga) හෝ ස්ක්රිප්ට් නොමැති පද්ධතිවල බිල්ඩින් which(වැනි tcshහෝ zsh) .whichcsh
එම කොන්දේසි සපුරා ඇත්නම්:
echo=$(which echo)
ඔබ ප්රථම මාර්ගය ලබා දෙන echoදී $PATHයන්න නොතකා, (කෙළවරේ අවස්ථාවක හැර) echoද ෂෙල් builtin / නොහොත් / ක්රියාව හෝ නැති විය වෙන්නේ.
වෙනත් ෂෙල් වෙඩි වලදී, ඔබ කැමති:
- zsh :
echo==echoහෝ echo=$commands[echo]හෝecho=${${:-echo}:c}
- ksh , zsh :
echo=$(whence -p echo)
- යෂ් :
echo=$(command -ev echo)
- rc , akanga :
echo=`whatis -p echo`(අවකාශයන් සහිත මාර්ග වලින් පරිස්සම් වන්න)
- මාළු :
set echo (type -fp echo)
ඔබට කිරීමට අවශ්ය වන්නේ එම විධානය ක්රියාත්මක කිරීම නම් echo, ඔබට එහි මාර්ගය ලබා ගත යුතු නැත, ඔබට කළ හැක්කේ:
env echo this is not echoed by the builtin echo
උදාහරණයක් ලෙස, tcshබිල්ඩින් whichභාවිතය වැළැක්වීම සඳහා :
set Echo = "`env which echo`"
ඔබට බාහිර විධානයක් අවශ්ය වූ විට
ඔබට බාහිර විධානයක් අවශ්ය වූ whichවිට භාවිතා කිරීමට අවශ්ය තවත් අවස්ථාවක් . POSIX ට අවශ්ය වන්නේ සියලුම ෂෙල් බිල්ඩින් (වැනි ) බාහිර විධාන ලෙස ලබා ගත හැකි නමුත් අවාසනාවකට බොහෝ පද්ධති වල එය එසේ නොවේ. උදාහරණයක් ලෙස, ලිනක්ස් පාදක මෙහෙයුම් පද්ධතිවල විධානයක් සොයා ගැනීම දුර්ලභ වන අතර ඒවායින් බොහොමයකට විධානයක් ඇත (විවිධ විකල්ප සහ හැසිරීම් ඇති විවිධ ඒවා වුවද).commandcommandcommandwhich
ඔබට බාහිර විධානයක් අවශ්ය විය හැකි අවස්ථා වනුයේ ඔබ පොසික්ස් කවචයක් භාවිතා නොකර විධානයක් ක්රියාත්මක කරන ඕනෑම තැනක ය.
මෙම system("some command line"), popen()... C හෝ විවිධ භාෂා ක්රියාත්මක නිසා, එම විධාන රේඛාව විග්රහ කළ කිරීමට ෂෙල් පහ කරන්න system("command -v my-cmd")ඔවුන්ට වැඩ කරන්න. එයට ව්යතිරේකයක් වනුයේ perlෂෙල් විශේෂ අක්ෂරයක් (අවකාශය හැර) නොපෙනේ නම් එය කවචය ප්රශස්ත කිරීමයි. එය එහි පසුගාමී ක්රියාකරුට ද අදාළ වේ:
$ perl -le 'print system "command -v emacs"'
-1
$ perl -le 'print system ":;command -v emacs"'
/usr/bin/emacs
0
$ perl -e 'print `command -v emacs`'
$ perl -e 'print `:;command -v emacs`'
/usr/bin/emacs
:;ඉහත සඳහන් එකතු කිරීම් මඟින් perlඑහි කවචයක් කැඳවීමට බල කෙරේ. භාවිතා කිරීමෙන් which, ඔබට එම උපක්රමය භාවිතා කිරීමට අවශ්ය නොවනු ඇත.
whichකිරීමට එරෙහි බොහෝ තර්ක අන්තර්ක්රියාකාරී ෂෙල් සන්දර්භයක් උපකල්පනය කරයි. මෙම ප්රශ්නය ටැග් කර ඇත / අතේ ගෙන යා හැකි බව. එබැවින් මම මෙම සන්දර්භය තුළ ඇති ප්රශ්නය අර්ථ දක්වන්නේ “whichදී ඇති නමක පළමු ක්රියාත්මක කළ හැකි දේ සොයා ගැනීම වෙනුවට භාවිතා කළ යුත්තේ කුමක්ද$PATH” යන්නයි.whichබොහෝ සැබෑ ලෝකයේ අතේ ගෙන යා හැකි ෂෙල් ස්ක්රිප්ට් යනු ශාස්ත්රීය උනන්දුවක් දක්වන අන්වර්ථයන්, බිල්ඩින් සහ කාර්යයන් සමඟ ගනුදෙනු කිරීමට එරෙහිව බොහෝ පිළිතුරු සහ හේතු . ෂෙල් ස්ක්රිප්ට් එකක් ධාවනය කිරීමේදී දේශීයව නිර්වචනය කරන ලද අන්වර්ථ නාමයන් උරුම නොවේ..