ඔබට කවදාවත් ඒ ගැන දැන ගැනීමට අවශ්ය නොවනු ඇතැයි ඔබ සිතූ සියල්ල මෙන්න:
සාරාංශය
බෝර්න් වැනි ෂෙල් ස්ක්රිප්ට් එකක ක්රියාත්මක කළ හැකි අයගේ මාර්ග නාමය ලබා ගැනීම සඳහා (අවවාද කිහිපයක් තිබේ; පහත බලන්න):
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
. csh
1978 දී පමණ අන්වර්ථ නාමයන් හඳුන්වා දෙන ලදි ( csh
ප්රථම වරට 1979 මැයි මාසයේදී නිකුත් කරන 2BSD
ලදි), තවද .cshrc
පරිශීලකයන්ට කවචය රිසිකරණය කිරීම සඳහා සැකසීම (සෑම කවචයක්ම, ස්ක්රිප්ට් මෙන් අන්තර්ක්රියාකාරී නොවන විට පවා csh
කියවන පරිදි .cshrc
).
බෝර්න් කවචය ප්රථම වරට යුනික්ස් වී 7 හි 1979 දී නිකුත් කරන ලද අතර, ක්රියාකාරී සහය එකතු කරනු ලැබුවේ බොහෝ කලකට පසුවය (1984 එස්වීආර් 2 හි), කෙසේ වෙතත්, එය කිසි විටෙකත් කිසියම් rc
ගොනුවක් නොතිබුණි (එනම් .profile
ඔබේ පරිසරය වින්යාස කිරීම මිස ෂෙල් එකකට නොව ).
csh
බෝර්න් කවචයට වඩා බොහෝ ජනප්රිය විය (එය බෝර්න් කවචයට වඩා නරක වාක්ය ඛණ්ඩයක් තිබුණද) එය අන්තර්ක්රියාකාරී භාවිතය සඳහා වඩාත් පහසු සහ ලස්සන අංග රාශියක් එක් කරයි.
දී 3BSD
(1980), වන which
csh තිර රචනය සඳහා එක් කරන ලදී csh
උදව් කිරීමට භාවිතා කරන්නන්ගෙන් ක්රියාත්මක හඳුනා, සහ එය ඔබ සොයා ගත හැකි ඉතා බැරෑරුම් කටයුක්තකි වෙනස් ස්ක්රිප්ට් which
බොහෝ වාණිජ Unices අද කාලයේ (Solaris, HP / UX, AIX හෝ Tru64 වැනි) මත.
එම ස්ක්රිප්ට් මඟින් පරිශීලකයාගේ ~/.cshrc
(සියලු csh
ස්ක්රිප්ට් භාවිතා නොකරන්නේ නම් csh -f
) කියවන අතර , ලබා දී ඇති විධාන නාමයන් අන්වර්ථ ලැයිස්තුවේ සහ $path
( csh
පදනම් කරගෙන පවත්වා ගෙන යන අරාව ) සොයා බලයි $PATH
.
මෙන්න ඔබ යන්න, which
එකල වඩාත්ම ජනප්රිය කවචය සඳහා පළමු තැනට පැමිණියේය ( csh
90 දශකයේ මැද භාගය වන තුරුම එය තවමත් ජනප්රිය විය), එය පොත් වල ලේඛනගත වීමට ප්රධාන හේතුව වන අතර එය තවමත් බහුලව භාවිතා වේ.
csh
පරිශීලකයෙකු සඳහා වුවද , එම which
csh ස්ක්රිප්ට් මඟින් ඔබට නිවැරදි තොරතුරු ලබා නොදෙන බව සලකන්න. එය අර්ථ දක්වා ඇති අන්වර්ථ නාමයන් ලබා ගනී, ~/.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
( එෆ්එස්එෆ් අනුග්රහය දක්වන ) පොදු වසම ක්රියාත්මක කිරීම zsh
1989 සහ 1991 අතර කාලය තුළ එළියට පැමිණියේය.
Ash ෂ්, බෝර්න් කවචය වෙනුවට ආදේශකයක් ලෙස අදහස් කළද type
බොහෝ කලකට පසුව (නෙට්බීඑස්ඩී 1.3 සහ ෆ්රීබීඑස්ඩී 2.3) බිල්ඩින් එකක් නොතිබුණි hash -v
. OSF / 1 /bin/sh
හි type
බිල්ඩින් එකක් තිබූ අතර එය සෑම විටම OSF / 1 v3.x දක්වා 0 ක් ආපසු ලබා දුන්නේය. bash
එකතු නොකළ whence
නමුත් මාර්ගය මුද්රණය කිරීමට ( සමාන වනු ඇත ) සහ ගැලපෙන සියලු විධානයන් වාර්තා කිරීමට -p
විකල්පයක් එක් කළේය . කළ builtin හා එකතු වගේ වැඩ විධාන ගේ . ඒවා සියල්ලම තිබේ.type
type -p
whence -p
-a
tcsh
which
where
bash
type -a
zsh
මෙම fish
ෂෙල් (2005) සතුව type
ශ්රිතයක් ලෙස ක්රියාත්මක විධාන.
මේ අතර which
සීඑස් ස්ක්රිප්ට් නෙට්බීඑස්ඩී වෙතින් ඉවත් කරන ලදි (එය ටීසීඑස් වලින් සාදා ඇති නිසා සහ වෙනත් ෂෙල් වෙඩි වල එතරම් භාවිතයට නොගත් නිසා), සහ එකතු කරන ලද ක්රියාකාරිත්වය whereis
(ආයාචනා කරන which
විට whereis
හැසිරෙන්නේ which
එය ක්රියාත්මක කළ හැකි දෑ පමණක් හැරෙන්නට හැර $PATH
). OpenBSD සහ FreeBSD හි, which
C හි ලියා ඇති එකක් ලෙස වෙනස් කරන ලද අතර එය විධාන $PATH
පමණක් පෙනේ.
ක්රියාත්මක කිරීම
which
විවිධ වාක්ය ඛණ්ඩ සහ හැසිරීම් සහිත විවිධ ඒකක මත විධානයක් ක්රියාත්මක කිරීම දුසිම් ගණනක් ඇත .
ලිනක්ස් හි (බිල්ඩින් tcsh
සහ ඇතුළත zsh
) අපට ක්රියාත්මක කිරීම් කිහිපයක් හමු වේ. නිදසුනක් ලෙස මෑත ඩේබියන් පද්ධති වල, එය විධාන සොයන සරල POSIX shell විධානාවලියකි $PATH
.
busybox
which
විධානයක් ද ඇත .
ඒ නිසා එය GNU
which
බොහෝ විට අධිකතර එකක් වන. එය which
csh ස්ක්රිප්ට් වෙනත් ෂෙල් වෙඩි වලට විස්තාරණය කිරීමට උත්සාහ කරයි : ඔබේ අන්වර්ථ නාම සහ ක්රියාකාරකම් මොනවාදැයි ඔබට එය පැවසිය හැකි අතර එමඟින් ඔබට වඩා හොඳ පිළිතුරක් ලබා දිය හැකිය (තවද සමහර ලිනක්ස් බෙදාහැරීම් ඒ සඳහා ගෝලීය අන්වර්ථ නාම කිහිපයක් සකස් කර ඇති බව මම විශ්වාස කරමි 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 -a
ksh93 හා වෙනත් ෂෙල් වෙඩි දී, ඔබ භාවිතා කළ හැකිය 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/ls
ls
/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
, ලෙස හොඳයි බව which
builtin වේ. තුළ csh
, එය පද්ධති which
විධානය වනු ඇත , එය අවස්ථා කිහිපයකදී ඔබට අවශ්ය දේ නොකරනු ඇත.
සමහර කවච වල පමණක් විධාන සොයා ගන්න
එය භාවිතා කිරීම අර්ථවත් විය හැකි අවස්ථාවක් which
නම්, ඔබට විධානයක මාර්ගය දැන ගැනීමට අවශ්ය නම්, විභව ෂෙල් බිල්ඩින් හෝ කාර්යයන් නොසලකා හැරීම bash
, csh
(නොවේ tcsh
) dash
, හෝ Bourne
ෂෙල් ස්ක්රිප්ට්, එනම් නැති whence -p
(වැනි ksh
හෝ zsh
) ෂෙල් වෙඩි , command -ev
(වැනි yash
), whatis -p
( rc
, akanga
) හෝ ස්ක්රිප්ට් නොමැති පද්ධතිවල බිල්ඩින් which
(වැනි tcsh
හෝ zsh
) .which
csh
එම කොන්දේසි සපුරා ඇත්නම්:
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 ට අවශ්ය වන්නේ සියලුම ෂෙල් බිල්ඩින් (වැනි ) බාහිර විධාන ලෙස ලබා ගත හැකි නමුත් අවාසනාවකට බොහෝ පද්ධති වල එය එසේ නොවේ. උදාහරණයක් ලෙස, ලිනක්ස් පාදක මෙහෙයුම් පද්ධතිවල විධානයක් සොයා ගැනීම දුර්ලභ වන අතර ඒවායින් බොහොමයකට විධානයක් ඇත (විවිධ විකල්ප සහ හැසිරීම් ඇති විවිධ ඒවා වුවද).command
command
command
which
ඔබට බාහිර විධානයක් අවශ්ය විය හැකි අවස්ථා වනුයේ ඔබ පොසික්ස් කවචයක් භාවිතා නොකර විධානයක් ක්රියාත්මක කරන ඕනෑම තැනක ය.
මෙම 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
බොහෝ සැබෑ ලෝකයේ අතේ ගෙන යා හැකි ෂෙල් ස්ක්රිප්ට් යනු ශාස්ත්රීය උනන්දුවක් දක්වන අන්වර්ථයන්, බිල්ඩින් සහ කාර්යයන් සමඟ ගනුදෙනු කිරීමට එරෙහිව බොහෝ පිළිතුරු සහ හේතු . ෂෙල් ස්ක්රිප්ට් එකක් ධාවනය කිරීමේදී දේශීයව නිර්වචනය කරන ලද අන්වර්ථ නාමයන් උරුම නොවේ.
.