“කුමන” භාවිතා නොකරන්නේ? එසේනම් කුමක් භාවිතා කළ යුතුද?


361

ක ක්රියාත්මක හෝ ඔබ Unix shell විධානයක් නම ඇතුලත් නම් සිදු වන්නේ කුමක්ද කියා පරීක්ෂා කිරීමට මාර්ගය සොයන විට, විවිධ උපයෝගිතා රාශිය තියෙනවා ( which, type, command, whence, where, whereis, whatis, hash, ආදිය).

whichඑය වළක්වා ගත යුතු බව අපට බොහෝ විට අසන්නට ලැබේ. මන්ද? ඒ වෙනුවට අප භාවිතා කළ යුත්තේ කුමක්ද?


3
මම හිතන්නේ භාවිතා whichකිරීමට එරෙහි බොහෝ තර්ක අන්තර්ක්‍රියාකාරී ෂෙල් සන්දර්භයක් උපකල්පනය කරයි. මෙම ප්‍රශ්නය ටැග් කර ඇත / අතේ ගෙන යා හැකි බව. එබැවින් මම මෙම සන්දර්භය තුළ ඇති ප්‍රශ්නය අර්ථ දක්වන්නේ “ whichදී ඇති නමක පළමු ක්‍රියාත්මක කළ හැකි දේ සොයා ගැනීම වෙනුවට භාවිතා කළ යුත්තේ කුමක්ද $PATH” යන්නයි. whichබොහෝ සැබෑ ලෝකයේ අතේ ගෙන යා හැකි ෂෙල් ස්ක්‍රිප්ට් යනු ශාස්ත්‍රීය උනන්දුවක් දක්වන අන්වර්ථයන්, බිල්ඩින් සහ කාර්යයන් සමඟ ගනුදෙනු කිරීමට එරෙහිව බොහෝ පිළිතුරු සහ හේතු . ෂෙල් ස්ක්‍රිප්ට් එකක් ධාවනය කිරීමේදී දේශීයව නිර්වචනය කරන ලද අන්වර්ථ නාමයන් උරුම නොවේ ..
මැට්බියන්කෝ

5
Att මැට්බියන්කෝ, ඔව්, csh(සහ whichතවමත් cshබොහෝ වාණිජ ඒකකවල පිටපතක් වේ) ~/.cshrcඅන්තර්ක්‍රියාකාරී නොවන විට කියවනු ලැබේ . Csh ස්ක්‍රිප්ට් සාමාන්‍යයෙන් ආරම්භ වන බව ඔබ දකින්නේ එබැවිනි #! /bin/csh -f. whichඑය අන්වර්ථයන් ඔබට ලබා දීමට අරමුණු කර ඇති නිසා නොවේ, මන්ද එය (අන්තර්ක්‍රියාකාරී) භාවිතා කරන්නන් සඳහා මෙවලමක් ලෙස අදහස් කරන බැවිනි csh. POSIX shells භාවිතා කරන්නන් සතුව ඇත command -v.
ස්ටෙෆාන් චසෙලාස්

ud රුඩිමියර්, එවිට ඔබේ කවචය (t)csh(හෝ එය ඔබට නිවැරදිtypecommand -v ප්‍රති result ලය ලබා නොදෙන්නේ නම් ඔබට කමක් නැත), භාවිතා කිරීම හෝ ඒ වෙනුවට පිළිතුර සැමවිටම ලැබෙනු ඇත . සඳහා පිළිතුරු බලන්න ඇයි .
ස්ටෙෆාන් චසෙලාස්

1
ud රුඩිමියර්, ( stat $(which ls)හේතු කිහිපයක් නිසා වැරදියි (අතුරුදහන් --, නැතිවූ මිල ගණන්), භාවිතය පමණක් නොවේ which). ඔබ භාවිතා කරනු stat -- "$(command -v ls)"ඇත. එය lsසැබවින්ම ගොනු පද්ධතියේ ඇති විධානයකි (ඔබේ කවචයේ බිල්ඩින් එකක් හෝ අන්වර්ථයේ ක්‍රියාකාරිත්වය නොවේ). whichඔබට වැරදි මාර්ගයක් ලබා දිය හැකිය (ඔබ ඇතුළු වූයේ නම් ඔබේ කවචය ක්‍රියාත්මක වන මාර්ගය නොවේ ls) හෝ වෙනත් ෂෙල් වෙඩි වින්‍යාස කිරීමේදී අර්ථ දක්වා ඇති අන්වර්ථයක් ඔබට ලබා දිය හැකිය ...
ස්ටෙෆාන් චසෙලාස්

1
ud රුඩිමියර්, නැවතත්, බොහෝ whichක්‍රියාත්මක කිරීම් මඟින් ඔබට lsසොයා බැලිය හැකි කොන්දේසි ගණනාවක් තිබේ $PATH( lsඔබේ කවචයේ ඇති දේ නොසලකා ). sh -c 'command -v ls', හෝ zsh -c 'rpm -q --whatprovides =ls'ඔබට නිවැරදි පිළිතුර ලබා දීමට වැඩි ඉඩක් ඇත. මෙහි ඇති කාරණය whichනම් එය බිඳුණු උරුමයකි csh.
ස්ටෙෆාන් චසෙලාස්

Answers:


394

ඔබට කවදාවත් ඒ ගැන දැන ගැනීමට අවශ්‍ය නොවනු ඇතැයි ඔබ සිතූ සියල්ල මෙන්න:

සාරාංශය

බෝර්න් වැනි ෂෙල් ස්ක්‍රිප්ට් එකක ක්‍රියාත්මක කළ හැකි අයගේ මාර්ග නාමය ලබා ගැනීම සඳහා (අවවාද කිහිපයක් තිබේ; පහත බලන්න):

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, ඔබට එම උපක්‍රමය භාවිතා කිරීමට අවශ්‍ය නොවනු ඇත.


25
@Joe, whichයනු cshබොහෝ වාණිජ Unices ස්ක්රිප්ට්. හේතුව historical තිහාසික ය, ඒ නිසා මම ඉතිහාසය ලබා දුන්නෙමි, එබැවින් එය පැමිණියේ කොහෙන්ද, මිනිසුන් එය භාවිතා කිරීමට පුරුදු වූයේ ඇයි සහ ඇත්ත වශයෙන්ම ඔබ එය භාවිතා කිරීමට කිසිදු හේතුවක් නැත්තේ ඇයිද යන්න ජනතාව තේරුම් ගනී. ඔව්, සමහර අය (t) csh භාවිතා කරයි. සෑම දෙනාම තවමත් ලිනක්ස් භාවිතා කර නැත
ස්ටෙෆාන් චසෙලාස්

13
මෙම ලිපිය කියවීමෙන් පසු, පිළිතුර සඳහා මට බොහෝ සන්දර්භයන් හමු වී ඇත, නමුත් පිළිතුරම නොවේ. ඔබ භාවිතා කිරීමට උත්සාහ කරන දේවල්, ඉතිහාසය , ක්‍රියාත්මක කිරීම , අදාළ කාර්යයන් කිරීමට වෙනත් විධානයන් හෝ සත්‍ය වශයෙන්ම භාවිතා කිරීමට හේතු ලෙස නොව, භාවිතා නොකළ යුත්තේ මන්දැයි මෙම ලිපියේ ඇත්ත වශයෙන්ම කියන්නේ කොතැනින්ද ? අනෙක් විධානයන් වඩා හොඳ වන්නේ ඇයි? ඔවුන් වෙනස් ලෙස කරන්නේ කුමක්ද? ඔවුන් එහි අන්තරායන් වළක්වා ගන්නේ කෙසේද? මෙම පිළිතුර ඇත්ත වශයෙන්ම විකල්ප සමඟ ඇති ගැටළු වලට වඩා වැඩි වචන ප්‍රමාණයක් වැය කරයි . whichwhichwhichwhichwhichwhichwhich
user2357112 මොනිකා

3
commandPOSIX විසින් විස්තර කර ඇත.
Kaz

3
@ StéphaneChazelas මම නව ගොනුවක් නිර්මාණය කර touch /usr/bin/mytestfileඉන් පසුව ධාවනය කරන්නේ නම් command -v mytestfile, එය මාර්ගය ලබා දෙනු ඇත (නමුත් which mytestfileඑසේ නොවේ).
jarno

2
අර්නෝ, ඔහ්, ඔබ හරි. bash(ප්රායෝගිකව එක් වෙනුවට ඇත නමුත් එය "හරි" ය, ඒ එය ක්රියාත්මක එක් සොයා නොහැකි නම්, එක්-ක්රියාකාරී නොවන ගොනු මත පදිංචි කරනු ඇත command -v/ typeදෝෂයක් නැවත) ඒ විධානය තියෙන්නේ ලෙස එය ඔබ ක්රියාත්මක කරන විට ක්රියාත්මක කිරීමට උත්සාහ කරන mytestfileනමුත්, dashහැසිරීම දෝෂ සහිතය, cmdක්‍රියාත්මක කළ හැකි එකකට වඩා ක්‍රියාත්මක කළ නොහැකි දෙයක් තිබේ නම්, ක්‍රියාත්මක කළ නොහැකි එක command -vනැවත ලබා දෙන අතර ක්‍රියාත්මක වන cmdවිට ක්‍රියාත්මක කළ හැකි එක ක්‍රියාත්මක වේ (වැරදි එකද හෑෂ් වේ). FreeBSD sh(ද පදනම් කරගෙන ash) එකම දෝෂයක් ඇත. zsh, yash, ksh, mksh, sh as sh ලෙස හරි.
ස්ටෙෆාන් චසෙලාස්

50

යමෙකු භාවිතා කිරීමට අකමැති වීමට හේතු whichදැනටමත් පැහැදිලි කර ඇත, නමුත් whichඇත්ත වශයෙන්ම අසමත් වන පද්ධති කිහිපයක උදාහරණ කිහිපයක් මෙහි දැක්වේ .

මත Bourne-වැනි කටු, අපි ප්රතිදානය සංසන්දනය කරනවා whichප්රතිදානය සමග type( typeඑය ෂෙල් builtin වීම, එය බිම සත්යය විය, එය විධාන පතා කරන ආකාරය අපට කියන්නේ ෂෙල් තියෙන්නේ ලෙස අදහස් ඇති).

බොහෝ අවස්ථා කෙළවරේ ඇති අවස්ථා බව මතක තබා ගන්න which/ typeබොහෝ විට භාවිතා කරනුයේ කෙළවරේ ඇති අවස්ථා වලිනි (අනපේක්ෂිත හැසිරීමකට පිළිතුර සොයා ගැනීම සඳහා: පොළොව මත එම විධානය එසේ හැසිරෙන්නේ ඇයි, මා කැඳවන්නේ කුමන එකද? ).

බොහෝ පද්ධති, බොහෝ බෝර්න් වැනි ෂෙල් වෙඩි: කාර්යයන්

වඩාත්ම පැහැදිලිව පෙනෙන අවස්ථාව වන්නේ කාර්යයන් සඳහා ය:

$ type ls
ls is a function
ls ()
{
[ -t 1 ] && set -- -F "$@";
command ls "$@"
}
$ which ls
/bin/ls

හේතුව which, ක්‍රියාත්මක කළ හැකි දේ ගැන පමණක් වාර්තා වන අතර සමහර විට අන්වර්ථ නාමයන් ගැන (සෑම විටම ඔබේ කවචයේ ඒවා නොවුනත්) ක්‍රියා නොකරයි.

ක්‍රියාකාරී පිටුව වාර්තා $@කිරීම සඳහා එය භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ උදාහරණය කැඩී ඇති (ඔවුන් උපුටා දැක්වීමට අමතක කළ පරිදි ) GNU සතුව ඇත , නමුත් අන්වර්ථ නාමයන් මෙන්, එය ෂෙල් සින්ටැක්ස් විග්‍රහයක් ක්‍රියාත්මක නොකරන නිසා එය පහසුවෙන් රැවටී ඇත:

$ which() { (alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@";}
$ f() { echo $'\n}\ng ()\n{ echo bar;\n}\n' >> ~/foo; }
$ type f
f is a function
f ()
{
echo '
}
g ()
{ echo bar;
}
' >> ~/foo
}
$ type g
bash: type: g: not found
$ which f
f ()
{
echo '
}
$ which g
g ()
{ echo bar;
}

බොහෝ පද්ධති, බොහෝ බෝර්න් වැනි ෂෙල් වෙඩි: බිල්ඩින්

තවත් පැහැදිලි අවස්ථාවක් වන්නේ බිල්ඩින් හෝ මූල පද, whichබාහිර විධානයක් වීම නිසා ඔබේ කවචයේ ඇති බිල්ඩින් මොනවාදැයි දැන ගැනීමට හැකියාවක් නැත (සහ සමහර ෂෙල් වෙඩි වැනි zsh, bashහෝ kshබිල්ඩින් ගතිකව පැටවිය හැකිය):

$ type echo . time
echo is a shell builtin
. is a shell builtin
time is a shell keyword
$ which echo . time
/bin/echo
which: no . in (/bin:/usr/bin)
/usr/bin/time

( එය ගොඩනඟා ඇති zshස්ථානයට අදාළ නොවේ which)

සොලාරිස් 10, AIX 7.1, HP / UX 11i, Tru64 5.1 සහ තවත් බොහෝ දේ:

$ csh
% which ls
ls:   aliased to ls -F
% unalias ls
% which ls
ls:   aliased to ls -F
% ksh
$ which ls
ls:   aliased to ls -F
$ type ls
ls is a tracked alias for /usr/bin/ls

එයට හේතුව බොහෝ වාණිජ ඒකකවල which(3BSD හි මුල් ක්‍රියාවට නැංවීමේදී මෙන්) cshකියවන පිටපතකි ~/.cshrc. ඔබ විසින් නිර්වචනය කර ඇති අන්වර්ථ නාමයන් සහ ඔබ සැබවින්ම භාවිතා කරන කවචය නොසලකා එය නිර්වචනය කරනු ලබන අන්වර්ථයන් වේ.

HP / UX හෝ Tru64 හි:

% echo 'setenv PATH /bin:/usr/bin' >> ~/.cshrc
% setenv PATH ~/bin:/bin:/usr/bin
% ln -s /bin/ls ~/bin/
% which ls
/bin/ls

(සොලාරිස් සහ ඒඅයිඑක්ස් අනුවාදයන් එම ගැටළුව නිරාකරණය කර ඇත්තේ $pathකියවීමට පෙර ඉතිරිකිරීම ~/.cshrcසහ විධානය (ය) බැලීමට පෙර එය ප්‍රතිස්ථාපනය කිරීමෙනි )

$ type 'a b'
a b is /home/stephane/bin/a b
$ which 'a b'
no a in /usr/sbin /usr/bin
no b in /usr/sbin /usr/bin

හෝ:

$ d="$HOME/my bin"
$ mkdir "$d"; PATH=$PATH:$d
$ ln -s /bin/ls "$d/myls"
$ type myls
myls is /home/stephane/my bin/myls
$ which myls
no myls in /usr/sbin /usr/bin /home/stephane/my bin

(ඇත්ත වශයෙන්ම, cshස්ක්‍රිප්ට් එකක් වීම නිසා එය අවකාශයන් අඩංගු තර්ක සමඟ ක්‍රියා කරනු ඇතැයි අපේක්ෂා කළ නොහැක ...)

CentOS 6.4, bash

$ type which
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
$ alias foo=': "|test|"'
$ which foo
alias foo=': "|test|"'
        /usr/bin/test
$ alias $'foo=\nalias bar='
$ unalias bar
-bash: unalias: bar: not found
$ which bar
alias bar='

එම පද්ධතියේ, GNU whichවිධානය ඔතා ඇති අන්වර්ථ අර්ථ දක්වා ඇති පද්ධතිය පුරා ඇත.

නිසා ව්යාජ තර්ක ප්රතිදානය whichප්රතිදානය කියවන bashගේ aliasනමුත් එය නිසි ලෙස විග්රහ කළ යුතු ආකාරය දන්නේ නැහැ හා භාවිතයන් ස්වතෝන්වේෂණ (එක් පේළියකට එක් හෙවත්, පසු පළමු සොයා ගත් විධානය සඳහා වන පෙනුම |, ;, &...)

CentOS හි ඇති නරකම දෙය zshනම් පරිපූර්ණ සිහින් whichබිල්ඩින් විධානයක් ඇති නමුත් එය ක්‍රියා විරහිත අන්වර්ථයක් GNU වෙත ප්‍රතිස්ථාපනය කිරීමෙන් එය බිඳ දැමීමට CentOS සමත් විය which.

ඩේබියන් 7.0, ksh93:

(බොහෝ ෂෙල් වෙඩි ඇති බොහෝ පද්ධති සඳහා අදාළ වුවද)

$ unset PATH
$ which which
/usr/local/bin/which
$ type which
which is a tracked alias for /bin/which

ඩේබියන් /bin/whichහි /bin/shතිර රචනයකි. මගේ කාරණයේදී, shසිටීම dashනමුත් එය එසේමය bash.

ක ශූන්යය PATHආබාධිත නොවේ PATHබැලීම, නමුත් පද්ධතියේ භාවිතා මාර්ගයෙන් පෙරනිමි PATH අවාසනාවකට Debian මත, කිසිවෙක් මත එකඟ (වන dashහා bashඇති /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, zshඇති /bin:/usr/bin:/usr/ucb:/usr/local/bin, ksh93ඇති /bin:/usr/bin, mkshඇති /usr/bin:/bin( $(getconf PATH)), execvp()(දී මෙන් env) ඇත :/bin:/usr/bin(ඔව්, පළමු වත්මන් නාමාවලියේ පෙනුම! )).

ඒ නිසයි whichඑය භාවිතා කරනවා සිට ඉහත එය වැරදි ලැබෙන dashපෙරනිමි PATHවෙනස් වන ksh93s ''

whichවාර්තා කරන GNU සමඟ වඩා හොඳ නැත :

which: no which in ((null))

(සිත්, එහි එක් අතෙකින් බලන /usr/local/bin/whichඇත්තටම කලින් යන මගේ පද්ධතිය මත akangaසමඟ පැමිණි තිර රචනය akanga(ක rcපෙරනිමි එහිදී ෂෙල් ව්යුත්පන්න PATHවේ /usr/ucb:/usr/bin:/bin:.))

bash, ඕනෑම පද්ධතියක්:

එක් ඔහුගේ පිළිතුර ක්රිස් සඳහන් කරන :

$ PATH=$HOME/bin:/bin
$ ls /dev/null
/dev/null
$ cp /bin/ls bin
$ type ls
ls is hashed (/bin/ls)
$ command -v ls
/bin/ls
$ which ls
/home/chazelas/bin/ls

hashඅතින් ඇමතීමෙන් පසුවද :

$ type -a which
which is /usr/local/bin/which
which is /usr/bin/which
which is /bin/which
$ hash -p /bin/which which
$ which which
/usr/local/bin/which
$ type which
which is hashed (/bin/which)

දැන් whichසමහර විට typeඅසමත් වන අවස්ථාවක්:

$ mkdir a b
$ echo '#!/bin/echo' > a/foo
$ echo '#!/' > b/foo
$ chmod +x a/foo b/foo
$ PATH=b:a:$PATH
$ which foo
b/foo
$ type foo
foo is b/foo

දැන්, ෂෙල් වෙඩි කිහිපයක් සමඟ:

$ foo
bash: ./b/foo: /: bad interpreter: Permission denied

අන් අය සමඟ:

$ foo
a/foo

වත් whichහෝ typeකල්තියාම දැන ගන්න පුළුවන් b/fooක්රියාත්මක කළ නොහැක. වැනි සමහර ෂෙල් වෙඩි bash, kshහෝ yash, කැඳවමින් විට fooනියත වශයෙන්ම ක්රියාත්මක කිරීමට උත්සාහ කරනු ඇත b/fooඅතර, (මෙවැනි අය, දෝෂයක් වාර්තා zsh, ash, csh, Bourne, tcsh) ක්රියාත්මක වනු ඇත a/fooමෙම අසාර්ථකත්වය මත execve()මත පද්ධතිය ඇමතුමක් b/foo.


mkshඇත්ත වශයෙන්ම පෙරනිමිය සඳහා වෙනස් දෙයක් භාවිතා කරයි $PATH: පළමුව, මෙහෙයුම් පද්ධතියේ සම්පාදක කාල නියතය _PATH_DEFPATHභාවිතා කරයි (බොහෝ විට BSD වල), පසුව confstr(_CS_PATH, …)භාවිතා වේ (POSIX), සහ දෙකම නොපවතින හෝ අසමත් වුවහොත් /bin:/usr/bin:/sbin:/usr/sbinභාවිතා වේ.
මිරබිලෝස්

1
ඔබගේ 1 වන උදාහරණයේ දී, lsඑය lsPATH වෙතින් භාවිතා කරන ශ්‍රිතයක් වුවද . හා whichඑක් භාවිතා කරන ඔබට කියන්න හොඳයි /usr/bin/ls හෝ /usr/local/bin/ls. "ඇයි භාවිතා නොකරන්නේ" යනුවෙන් මට නොපෙනේ ....
රූඩිමියර්

@rudimeier, ඒ which lsමට දෙන්නේ /bin/lsද යන්න පිළිබඳ lsඇමතුම් ශ්රිතයක් /bin/lsහෝ /opt/gnu/bin/lsහෝ dirහෝ සියලු කිසිවක්. IOW, which(ක්‍රියාත්මක කරන දේ, IMMV) අදාළ නොවන දෙයක් ලබා දෙයි
ස්ටෙෆාන් චසෙලාස්

1
@ ස්ටෙෆාන් චසෙලාස්. නෑ නෑ නෑ. මගේ කාර්යයක් බව මම දැනටමත් දනිමිls . මම දන්නවා මගේ lsක්‍රියාකාරිත්වය lsඑනවා කියලා PATH. දැන් whichමට කියනවා ගොනුව කොහෙද කියලා. ඔබට පෙනෙන්නේ එක් භාවිත අවස්ථාවක් පමණි: "මෙම විධානය සමඟ මගේ කවචය කුමක් කරයිද?" මෙම භාවිත නඩුව whichවැරදියි, නිවැරදි. (GNU) whichහරියටම නිවැරදි දෙය වන වෙනත් භාවිත අවස්ථා තිබේ.
රුඩිමියර්

udrudimeter, whichක්‍රියාත්මක කිරීම මත රඳා පවතී . සමහරු එය අන්වර්ථයක් යැයි ඔබට කියනු ඇත (ඔබ අන්වර්ථයක් වින්‍යාස කර තිබේ නම් හෝ ~/.cshrcඔබේ නිවසේ එවැනි අන්වර්ථයක් තිබේ නම්), සමහරු ඔබට මාර්ගයක් ලබා දෙනු ඇත, නමුත් සමහර කොන්දේසි යටතේ වැරදි මාර්ගය. sh -c 'command -v ls', පරිපූර්ණ නොවූවත්, එම වෙනස් අවශ්‍යතාවයට නිවැරදි පිළිතුරක් ලබා දීමට තවමත් වැඩි ඉඩක් ඇත (එසේම එය සම්මත වේ).
ස්ටෙෆාන් චසෙලාස්

21

(මගේ ඉක්මන් මග හැරීම) ස්ටෙෆේන් සඳහන් නොකළ එක් දෙයක් නම්, whichඔබේ කවචයේ ගමන් හැෂ් වගුව ගැන කිසිම අදහසක් නැති බවය. මෙය සත්‍ය වශයෙන්ම ක්‍රියාත්මක වන දේ නියෝජනය නොකරන ප්‍රති result ලයක් ලබා දිය හැකි අතර එය නිදොස්කරණය කිරීමේදී අකාර්යක්ෂම කරයි.


-3

මග හැරිය යුතු දේ අපට බොහෝ විට අසන්නට ලැබේ. මන්ද? ඒ වෙනුවට අප භාවිතා කළ යුත්තේ කුමක්ද?

මම ඒක කවදාවත් අහලා නැහැ. කරුණාකර නිශ්චිත උදාහරණ සපයන්න. ඔබගේ ලිනක්ස් බෙදා හැරීම සහ ස්ථාපිත මෘදුකාංග පැකේජ ගැන මම කනස්සල්ලට පත්වෙමි which.

SLES 11.4 x86-64

tcsh අනුවාදය 6.18.01 හි:

> which which

which: shell built-in command.

3.2-147 අනුවාදයේ:

> which which

/usr/bin/which

> which -v

GNU which v2.19, Copyright (C) 1999 - 2008 Carlo Wood.
GNU which comes with ABSOLUTELY NO WARRANTY;
This program is free software; your freedom to use, change
and distribute this program is protected by the GPL.

which ලිනක්ස් මෙහෙයුම් පද්ධතියේ කොටසක් ලෙස භාවිතා කිරීම සඳහා ලිනක්ස් කර්නල් සංවිධානය විසින් බෙදා හරින ලද සම්මත පැකේජයක් වන යූට්-ලිනක්ස් හි කොටසකි. එය මෙම අනෙකුත් ලිපිගොනු ද සපයයි

/bin/dmesg
/bin/findmnt
/bin/logger
/bin/lsblk
/bin/more
/bin/mount
/bin/umount
/sbin/adjtimex
/sbin/agetty
/sbin/blkid
/sbin/blockdev
/sbin/cfdisk
/sbin/chcpu
/sbin/ctrlaltdel
/sbin/elvtune
/sbin/fdisk
/sbin/findfs
/sbin/fsck
/sbin/fsck.cramfs
/sbin/fsck.minix
/sbin/fsfreeze
/sbin/fstrim
/sbin/hwclock
/sbin/losetup
/sbin/mkfs
/sbin/mkfs.bfs
/sbin/mkfs.cramfs
/sbin/mkfs.minix
/sbin/mkswap
/sbin/nologin
/sbin/pivot_root
/sbin/raw
/sbin/sfdisk
/sbin/swaplabel
/sbin/swapoff
/sbin/swapon
/sbin/switch_root
/sbin/wipefs
/usr/bin/cal
/usr/bin/chrp-addnote
/usr/bin/chrt
/usr/bin/col
/usr/bin/colcrt
/usr/bin/colrm
/usr/bin/column
/usr/bin/cytune
/usr/bin/ddate
/usr/bin/fallocate
/usr/bin/flock
/usr/bin/getopt
/usr/bin/hexdump
/usr/bin/i386
/usr/bin/ionice
/usr/bin/ipcmk
/usr/bin/ipcrm
/usr/bin/ipcs
/usr/bin/isosize
/usr/bin/line
/usr/bin/linux32
/usr/bin/linux64
/usr/bin/look
/usr/bin/lscpu
/usr/bin/mcookie
/usr/bin/mesg
/usr/bin/mkzimage_cmdline
/usr/bin/namei
/usr/bin/rename
/usr/bin/renice
/usr/bin/rev
/usr/bin/script
/usr/bin/scriptreplay
/usr/bin/setarch
/usr/bin/setsid
/usr/bin/setterm
/usr/bin/tailf
/usr/bin/taskset
/usr/bin/time
/usr/bin/ul
/usr/bin/uname26
/usr/bin/unshare
/usr/bin/uuidgen
/usr/bin/wall
/usr/bin/whereis
/usr/bin/which
/usr/bin/write
/usr/bin/x86_64
/usr/sbin/addpart
/usr/sbin/delpart
/usr/sbin/fdformat
/usr/sbin/flushb
/usr/sbin/freeramdisk
/usr/sbin/klogconsole
/usr/sbin/ldattach
/usr/sbin/partx
/usr/sbin/rcraw
/usr/sbin/readprofile
/usr/sbin/rtcwake
/usr/sbin/setctsid
/usr/sbin/tunelp

මගේ util-linuxඅනුවාදය 2.19. මුදා හැරීමේ සටහන් v2.13 දිනැති (28-අගෝස්තු -2007) දක්වා පහසුවෙන් සොයාගත හැකිය. මෙහි අරමුණ හෝ ඉලක්කය කුමක්දැයි නිශ්චිතවම කිව නොහැකි අතර, 331 වතාවක් ඉහළට ඔසවා ඇති එම දීර් thing දෙයට එයට නිසැකවම පිළිතුරු නොලැබුණි.


4
ප්‍රශ්නය යුනික්ස් ගැන සඳහන් කරන්නේ කුමක් දැයි සඳහන් නොකරන්නේ කෙසේදැයි බලන්න. ලිනක්ස් යනු ස්වල්පයෙන් එකකි.
කුසලානන්ද

4
ඔබගේ which -vසංදර්ශන වලට අනුව, එය GNU ය (අනෙක් පිළිතුරෙහි සඳහන් කර ඇති අතිරික්තය සහ එය කිසිසේත් ලිනක්ස් සඳහා විශේෂිත නොවේ), AFAIK කිසි විටෙකත් whichඋපයෝගීතාවයක් ඇතුළත් නොකළ util-linux නොවේ . util-linux 2.19 2011 සිට, GNU 2008 සිට 2.19 වේ.
ස්ටෙෆාන් චසෙලාස්
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.