මගේ Bash ස්ක්‍රිප්ට් අන්වර්ථයන් හඳුනා නොගන්නේ ඇයි?


237

මගේ ~/.bashrcගොනුවේ අර්ථ දැක්වීම් දෙකක් තිබේ:

  1. commandA, එය දිගු මාවතකට අන්වර්ථයකි
  2. commandB, එය Bash ස්ක්‍රිප්ටයේ අන්වර්ථයකි

මෙම විධාන දෙක සමඟ එකම ගොනුව සැකසීමට මට අවශ්‍යය, එබැවින් මම පහත දැක්වෙන Bash ස්ක්‍රිප්ට් ලිවීය:


#!/bin/bash

for file in "$@"
    do
    commandA $file
    commandB $file
done

මගේ සැසිවාරයෙන් ඉවත් වී නැවත පුරනය වීමෙන් පසුව පවා, command not foundමම මෙම ස්ක්‍රිප්ට් එක ක්‍රියාත්මක කරන විට Bash විසින් විධාන දෙකටම දෝෂ ඇති කරයි.

මම වැරදි කරන්නේ කුමක් ද?


10
BTW, අන්වර්ථයක් හඳුනා ගැනීම සඳහා ලොග් වීමට සහ පිටතට යාමට අවශ්‍ය නැත. ඔබට අවශ්‍ය වන්නේ එයයි source ~/.bashrc.
tshepang

මගේ නඩුව සඳහා මා දුරස්ථව SSH නියෝජිතයා විසින් සම්බන්ධ කරන ලදි, අන්වර්ථය එකතු කිරීමෙන් පසු මම SSH නියෝජිතයා වසා දමා නැවත සම්බන්ධ වූ විට එය ක්‍රියාත්මක වීමට පටන් ගත්තේය.
dav

අන්වර්ථයක් යනු විධානයක් කෙටි කිරීමේ ක්‍රමයකි. (ඔවුන් පමණක් ස්ක්රිප්ට් අන්තර් ෂෙල් වෙඩි හා නොවේ තුළ භාවිතා වේ - මෙම තිර රචනය සහ අන්තර්ක්රියාකාරී ශෙලයක් අතර ඉතා සුළු වෙනස්කම් එකකි.)
තරහක් Roofe

Answers:


126

පළමුවෙන්ම, ඩිඩිමෙක් පැවසූ පරිදි, පෙරනිමියෙන් අන්වර්ථයන් අන්තර්ක්‍රියාකාරී නොවන ෂෙල් වෙඩි තුළ පුළුල් නොවේ.

දෙවනුව, .bashrcඔබ BASH_ENVපරිසර විචල්‍යය සකසන්නේ නම් මිස අන්තර්ක්‍රියාකාරී නොවන කවච මඟින් කියවනු නොලැබේ .

නමුත් වැදගත්ම දේ: එසේ නොකරන්න! කරුණාකර? යම් දවසක ඔබ එම පිටපත අවශ්‍ය අන්වර්ථයන් සකසා නැති තැනකට ගෙන යන අතර එය නැවත කැඩී යනු ඇත.

ඒ වෙනුවට ඔබේ ස්ක්‍රිප්ටයේ කෙටිමං ලෙස පරිසර විචල්‍යයන් සකසා භාවිතා කරන්න:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "$@"
do
    $CMDA "$file"
    $CMDB "$file"
done

6
සුපුරුදු aliasභාවිත අවස්ථා සඳහා එම විසඳුම ක්‍රියා නොකරයි . උදා alias mv="mv -v --backup=numbered".
Evi1M4chine

Vi Evi1M4chine: ඔව්. අවම වශයෙන් මම ගිලෙස් අනවශ්‍ය සංස්කරණය ආපසු හැරවූ පසු. කෙසේ වෙතත්, පරාමිතීන් සඳහා වෙනත් විචල්‍යයක් භාවිතා කිරීම වඩා හොඳ විය හැකිය.

1
ආහ්, අවට මිල ගණන් නොමැති වීම සැලකිල්ලට ගන්න $CMDA/ $CMDB… ලොකු විචල්‍යයන් හැරුණු විට බාෂ් සඳහාම වෙන් කර ඇති අතර, එය සැබවින්ම ක්‍රියාත්මක වන අතර, එම උපුටා දැක්වීම් නොමැතිකම මට ඇත්තෙන්ම අපහසුතාවයක් ගෙන දෙයි… කෙසේ වෙතත් ස්තූතියි.
Evi1M4chine

@ Evi1M4chine: අහ්, මොකක්ද? 1. මම නවතම සංස්කරණයේ උපුටා දැක්වීම් ඉවත් කළෙමි. 2. ඔබ "බාෂ් සඳහාම වෙන් කර ඇති" ස්ථානය ලබා ගන්නේ කොහෙන්ද? මෙය මා අසා ඇති පළමු අවස්ථාව වේ. 3. නම් බව ඔබ කලබල විය කරයි, ඔබ මුලින්ම bash භාවිතා කරන ආකාරය පිළිබඳව ඔබට හැඟෙන්නේ කෙසේද? කෙසේ වෙතත්, මා ඔබට කී පරිදි විකල්ප සඳහා වෙනම විචල්‍යයක් භාවිතා කරන්න.

1
ඇල්වස්: උපකල්පනය නම් gizmoඑය මාර්ගයේ නොවේ හෝ එකම නමක් සහිත විධානයක් ඇති නමුත් ඉහළ ප්‍රමුඛතාවයක් ඇත. නැතිනම් ඔබට මුලින් CMDAසරළව සැකසිය හැකිය gizmo.

175

ඔබ සොයාගත් bash manpage එක දෙස බැලුවහොත්:

ෂොප් එක භාවිතා කරමින් එක්ස්පෑන්ඩ්_ඇලියස් ෂෙල් විකල්පය සකසා ඇත්නම් මිස ෂෙල් අන්තර්ක්‍රියාකාරී නොවන විට අන්වර්ථයන් පුළුල් නොවේ (ෂෙල් බිල්ටින් කොමන්ඩ්ස් යටතේ ඇති වෙළඳසැලේ විස්තරය බලන්න).

එබැවින් අ

shopt -s expand_aliases

ඔබේ පිටපතෙහි.

මෙය ඔබගේ ස්ක්‍රිප්ටයේ සැකසීමෙන් පසු ඔබේ අන්වර්ථ ගොනුව ප්‍රභව කිරීමට වග බලා ගන්න.

shopt -s expand_aliases
source ~/.bash_aliases

10
මම එය මගේ පිටපතෙහි තැබුවෙමි, නමුත් එය තවමත් ක්‍රියාත්මක නොවේ. එකම දෝෂයකි.
සයිඩ්

6
එකතු shopt -s expand_aliases source ~/.bash_aliasesකිරීම මට හොඳින් ගැලපේ. # If not running interactively, don't do anything [ -z "$PS1" ] && return.Bashrc හි බොහෝ විට අන්තර්ක්‍රියාකාරී කවච හඳුනාගැනීමේ ක්‍රමයක් ඇත: aid සයිඩ්, සමහර විට ඔබ ලබාගත් ගොනුවේ ඒ සඳහා පරීක්ෂා කිරීමට ඔබට අවශ්‍ය වනු ඇත.
ෆ්‍රෑන්ක් ෂුබට්

1
විශිෂ්ටයි! මගේ ස්ක්‍රිප්ට් බේරුවා !! :) ටර්මිනලයේ තොරතුරු සහ මෑන්පේජ් කියවීම / සෙවීම එතරම් අපහසු බැවින් මම බොහෝ කලකට පෙර අතහැර දමා අන්තර්ජාලයේ සෙව්වෙමි ...
ඇක්වාරියස් පවර්

3
කුතුහලය දනවන කරුණ නම්, shopt -s expand_aliasesඅන්වර්ථ අර්ථ දැක්වීමට පෙර නොව අන්වර්ථය භාවිතා කිරීමට පෙරය. RanFrankSchubert වෙත එකතු කිරීම: කවචය $-සඳහා විකල්පයන් අඩංගු අන්තර්ක්‍රියාකාරී කවච හඳුනාගැනීම ද සිදු කළ හැකිය , විශේෂයෙන් iකවචය අන්තර්ක්‍රියාකාරී නම්.
වලංගු

2
මෙය නිවැරදි පිළිතුරක් නොවේ ... ඔබේ අන්වර්ථ නාමයන් ඔබේ ස්ක්‍රිප්ට් එක තුළට ගෙන ඒම පිළිතුර නොවේ. ඔබගේ ~/.bash_aliasesඅන්තර්ක්‍රියාකාරි කවචය මත කලින් පටවා ඇති වෙනත් දේවල් මත රඳා පවතී ... මා සොයාගත් ආසන්නතම දෙය නම් ඔබේ හැෂ්බෑන්ග් #!/bin/bash -liතවමත් පරිපූර්ණ නොවේ. ඉතා මැනවින් ඔබ අන්වර්ථයන් නොව කාර්යයන් භාවිතා කළ යුතුය.
Stefanos Kalantzis

49

අන්වර්ථයන් අපනයනය කළ නොහැකි බැවින් ඒවා අර්ථ දක්වා නොමැති ෂෙල් ස්ක්‍රිප්ට් වල නොමැත. වෙනත් වචන වලින් කිවහොත්, ඔබ ඒවා නිර්වචනය කළහොත් ඒවා ~/.bashrcලබා ගත නොහැක your_script.sh(ඔබ ~/.bashrcස්ක්‍රිප්ටයේ මූලාශ්‍රය මිස , මම නිර්දේශ නොකරමි නමුත් මෙය නිසි ලෙස කිරීමට ක්‍රම තිබේ).

කෙසේ වෙතත්, කාර්යයන් අපනයනය කළ හැකි අතර ඒවා අර්ථ දක්වා ඇති පරිසරයකින් ක්‍රියාත්මක වන ෂෙල් ස්ක්‍රිප්ට් සඳහා ලබා ගත හැකිය. මෙය ඔබේ bashrc හි තැබීමෙන් මෙය කළ හැකිය:

foo ()
{
    echo "හෙලෝ වර්ල්ඩ්!"
}
අපනයනය -f foo

Bash අත්පොතෙහි පවසන පරිදි, "සෑම කටයුත්තකටම පාහේ අන්වර්ථයන්ට වඩා ෂෙල් ක්‍රියාකාරිත්වය වඩාත් සුදුසු වේ."


1
ඔබ හුදෙක් ඔබ විස්ථාපනය කල හැකි කියන්න මේ තාක්ෂණික, ප්රශ්නයට පිළිතුරක් නොලැබේ අතර alias commandA=...සමග commandA() { ... }එවකට export commandAඔබ නොහොත් සමාන හැසිරීම් ලබා ගන්න. එබැවින් මෙය අන්වර්ථ නාමයන්ට සමාන විකල්පයක් වන අතර මා දන්නා පරිදි එය බාෂ් ස්ක්‍රිප්ට් වල විශිෂ්ට ලෙස ක්‍රියා කරයි
ෆිලීඩා

මෙහි ඇති ගැටළුව නම්, ඔබට උපුටා ගත් විකල්ප රාශියක් ලබා දෙන අන්වර්ථයක් අවශ්‍ය වූ විට ය. උදාහරණයක් ලෙස නිදසුනක් ලෙස, කාර්යයන් කිරීමට අපහසු වන alias b=bashඑය කිරීම පහසු b -c "echo test | grep test"කරයි.
Fmstrat

MFmstrat: b () { bash "$@"; }ඉන්පසුb -c "echo test | grep test"
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

වෙනත් ස්ක්‍රිප්ට් එකකින් ශ්‍රිතය ලබාගත් ස්ක්‍රිප්ටයේ ශ්‍රිතයේ අන්තර්ගතය ඇගයීමට ලක් කළ යුතු විට මෙය ගැටළුව විසඳන්නේ නැත ...
අකිටෝ

12
[cmd line] > bash -i [your script's file path]

මෙම iඅන්තර් සඳහා වන අතර, ඔබේ මූලාශ්ර bashඔබ පැතිකඩ.


-6

සමහර විට bash ස්ක්‍රිප්ට් අපනයනය හඳුනා නොගන්නා බව මට පෙනී ගියේය. කෙසේ වෙතත්, එය වෙනස් කිරීම

#!/bin/sh

මට වැඩ කරයි.


1
නැත, එසේ නොවීය ...
හෆීස් තෙමුරි
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.