පරාමිතියක් ගන්නා Bash අන්වර්ථයක් සාදන්න?


1296

මම CShell භාවිතා කළා (), එය ඔබට පරාමිතියක් ගන්නා අන්වර්ථයක් සෑදීමට ඉඩ දෙයි. අංකනය වැනි දෙයක් විය

alias junk="mv \\!* ~/.Trash"

Bash හි, මෙය ක්‍රියාත්මක වන බවක් නොපෙනේ. Bash හි ප්‍රයෝජනවත් අංග රාශියක් ඇති බැවින්, මෙය ක්‍රියාත්මක කර ඇතැයි මම සිතමි, නමුත් කෙසේ දැයි මම කල්පනා කරමි.



2
ඔබ args පමණ මිල කැඳවීම් භාවිතා කරන බවට සහතික කරන්න"$1"
ක්රිස්ටෝෆ් Roussy

මෙම ප්‍රශ්නය SO සඳහා මාතෘකාවෙන් බැහැර ය. එය විය UNIX.SE මත පිළිතුරු , ඔබ පවා කරදර කිරීමට අවශ්ය නැති බව එම පිළිතුර: "උදාහරණයක් ලෙස, ඔබ නොහොත් කිරීමට නම් lsකිරීමට ls -la, එවකට ටයිප් ls foo barකරන ඇත්තටම ක්රියාත්මක ls -la foo bar. විධාන රේඛාවේ"
ඩෑන් ඩස්කල්ස්කු

8
එය විචල්‍යයක් නූලක් මැදට අන්තර්ග්‍රහණය කිරීමට උපකාරී නොවේ
ෆ්‍රාන්ස් සිතම්පලම්

1
මෙන්න මම මෙම වැරැද්ද සොයා ගැනීමට භාවිතා කළ ලිල් ටෙස්ට් අන්වර්ථය ... alias test_args="echo PREFIX --$1-- SUFFIX", test_args ABCDපහත සඳහන් කොන්සෝල ප්‍රතිදානය PREFIX ---- SUFFIX ABCD
ields ලදාව

Answers:


2164

Bash අන්වර්ථය සෘජුවම පරාමිතීන් පිළිගන්නේ නැත. ඔබට ශ්‍රිතයක් නිර්මාණය කිරීමට සිදුවනු ඇත.

aliasපරාමිතීන් භාර නොගන්නා නමුත් ශ්‍රිතයක් අන්වර්ථයක් ලෙස හැඳින්විය හැක. උදාහරණයක් වශයෙන්:

myfunction() {
    #do things with parameters like $1 such as
    mv "$1" "$1.bak"
    cp "$2" "$1"
}


myfunction old.conf new.conf #calls `myfunction`

මාර්ගය වන විට, ඔබගේ .bashrcසහ අනෙකුත් ලිපිගොනු වල අර්ථ දක්වා ඇති බෑෂ් කාර්යයන් ඔබේ කවචයේ විධාන ලෙස ලබා ගත හැකිය. උදාහරණයක් ලෙස ඔබට පෙර ශ්‍රිතය මේ ආකාරයට අමතන්න

$ myfunction original.conf my.conf

48
මම $1උපුටා දැක්වීම් කළ යුතුද ?
ජර්ගන් පෝල්

264
ඔබට අන්වර්ථය ප්‍රකාශ කිරීමට පවා අවශ්‍ය නැත. ශ්‍රිතය නිර්වචනය කිරීමෙන් පමණක් සිදු වේ.
dinigo

215
ඔබ අන්වර්ථයක් ශ්‍රිතයකට වෙනස් කරන්නේ නම්, sourceඔබේ .bashrc මඟින් ශ්‍රිතය එක් කරන නමුත් එය පැරණි අන්වර්ථය සමනය නොකරයි. අන්වර්ථයන් ශ්‍රිතවලට වඩා ඉහළ පූර්වාදර්ශයක් බැවින් එය අන්වර්ථය භාවිතා කිරීමට උත්සාහ කරනු ඇත. ඔබට ඔබේ කවචය වසා නැවත විවෘත කළ යුතුය, නැතහොත් අමතන්න unalias <name>. සමහර විට මම නාස්ති කළ විනාඩි 5 මම යමෙකු බේරා ගන්නෙමි.
මාටි නීල්

56
Ar මාටින් නීල්: මම සූර්යයාගෙන් ඉගෙන ගත් එක් කාල ඉතිරිකිරීමේ උපක්‍රමයක් නම් මෙය කිරීම පමණි exec bash: එය නව කවචයක් ආරම්භ කරනු ඇත, ඔබ ඔබේ වින්‍යාසයන් පිළිබඳ පැහැදිලි කියවීමක් ලබා දෙනු ඇත, ඔබ වසා දමා නැවත විවෘත කළාක් මෙන්, නමුත් එම සැසියේ පරිසර විචල්‍ය සැකසුම් ද තබා ගන්න. . එසේම, ක්‍රියාත්මක bashකිරීමකින් තොරව ක්‍රියාත්මක කිරීම ඔබට තොගයක් වැනි සිතුවිලි හැසිරවීමට අවශ්‍ය විට ප්‍රයෝජනවත් වේ.
මැක්නයිල් ෂෝන්

21
ichmich - ඔව්, සෑම විටම bash විචල්‍යයන් උපුටා දැක්වීම් වලට දමන්න. උදා mv "$1" "$1.bak". උපුටා දැක්වීම් නොමැතිව, hel 1 "හෙලෝ වර්ල්ඩ්" නම්, ඔබ ඒ mv hello world hello world.bakවෙනුවට ක්‍රියාත්මක කරනු ඇත mv "hello world" "hello world.bak".
orion elenzil

214

ඉහත පිළිතුර පිරිපහදු කිරීමෙන් ඔබට අන්වර්ථ නාම සඳහා 1-පේළියේ සින්ටැක්ස් ලබා ගත හැකිය, එය ෂෙල් හෝ .bashrc ලිපිගොනු වල තාවකාලික අර්ථ දැක්වීම් සඳහා වඩාත් පහසු වේ:

bash$ myfunction() { mv "$1" "$1.bak" && cp -i "$2" "$1"; }

bash$ myfunction original.conf my.conf

දකුණු වරහන වැසීමට පෙර අර්ධ කොලන් අමතක නොකරන්න. ඒ හා සමානව, සැබෑ ප්රශ්නය සඳහා:

csh% alias junk="mv \\!* ~/.Trash"

bash$ junk() { mv "$@" ~/.Trash/; }

හෝ:

bash$ junk() { for item in "$@" ; do echo "Trashing: $item" ; mv "$item" ~/.Trash/; done; }

3
Answer 1 සහ $ 2 විශේෂ අවස්ථා පමණක් වන අතර, මෙම පිළිතුරෙන් ද පැහැදිලි කර ඇති පරිදි, මෙම තර්කයට නැවත පැමිණිය හැකි බැවින්, මෙම පිළිතුරට මම කැමැත්තෙමි.
philo vivero

16
වෙනස් mv "$1" "$1.bak"; cp "$2" "$1" බවට mv "$1" "$1.bak" && cp "$2" "$1"විට ඔබේ දත්ත අහිමි නොවනු කිරීමට mvක් අමාරුවේ (උදා:, ගොනු සම්පූර්ණ පද්ධතිය).
හෙන්ක් ලැන්ග්වෙල්ඩ්

3
"දකුණු වරහන වැසීමට පෙර අර්ධ කොලන් අමතක නොකරන්න." බොහෝ වාරයක් මෙය! ස්තූතියි :)
කෞෂාල් මෝඩි

1
පළමු වරහනට පසුව සහ අවසාන වරහනට පෙර ඇති අවකාශයන් ද අවශ්‍ය වේ.
බ්‍රයන් චැපල්

1
En හෙන්ක්ලැන්ජ්වෙල්ඩ් ඔබේ ප්‍රකාශය නිවැරදිව පැවතුනද එයින් පෙනී යන්නේ ඔබ ටික කලක් සිට ඇති බවයි - අවසන් වරට “උපාංගයේ ඉඩක් ඉතිරිව නැත” යන දෝෂය මා හට හමු වූ විට මම නොදනිමි ;-). .
පීටර් - මොනිකා

126

ප්‍රශ්නය සරලව අසනු ලබන්නේ වැරදිය. ඔබ පරාමිතීන් ගන්නා අන්වර්ථයක් සාදන්නේ නැත, මන්ද aliasදැනටමත් පවතින දෙයකට දෙවන නමක් එක් කරයි. OP ට අවශ්‍ය වන්නේ functionනව ශ්‍රිතයක් නිර්මාණය කිරීමේ විධානයයි. ශ්‍රිතයට දැනටමත් නමක් ඇති බැවින් ඔබට ශ්‍රිතය අන්වර්ථ කිරීමට අවශ්‍ය නොවේ.

මම හිතන්නේ ඔබට මේ වගේ දෙයක් අවශ්‍යයි:

function trash() { mv "$@" ~/.Trash; }

ඒක තමයි! ඔබට para 1, $ 2, $ 3, වැනි පරාමිතීන් භාවිතා කළ හැකිය, නැතහොත් ඒවා with with සමඟ පුරවන්න.


7
මෙම පිළිතුර ඒ සියල්ල පවසයි. මම මෙම පිටුවේ පහළ සිට කියවා ඇත්නම්, මම යම් කාලයක් ඉතිරි කර ගන්නෙමි.
ජෝ

-1 අන්වර්ථයක් සහ ශ්‍රිතයක් සමාන නොවේ ...echo -e '#!/bin/bash\nshopt -s expand_aliases\nalias asrc='\''echo "${BASH_SOURCE[0]}"'\'' # note the '\''s\nfunction fsrc(){ echo "${BASH_SOURCE[0]}";}'>>file2&&echo -e '#!/bin/bash\n. file2\nalias rl='\''readlink -f'\''\nrl $(asrc)\nrl $(fsrc)'>>file1&&chmod +x file1&&./file1;rm -f file1 file2
නොපැහැදිලි තර්කනය

$@අවකාශය ආදිය සහිත ගොනු නාම සඳහා සහය දැක්වීමට ඔබ සැබවින්ම උපුටා දැක්විය යුතුය
ටොම් හේල්

ඔබට අන්වර්ථ පරාමිතීන් නොමැති බව සාමාන්‍ය පැහැදිලි කිරීමක් විය යුතුය, ඒ වෙනුවට ඔබ ශ්‍රිතයක් භාවිතා කරයි. දී ඇති ශ්‍රිතය මුල් උදාහරණයට ප්‍රතිවිරුද්ධ උදාහරණයක් පමණි. මම හිතන්නේ නැහැ පුද්ගලයා පොදු අරමුණු සඳහා කුණු කූඩයක් සොයමින් සිටියා කියා. කෙසේ වෙතත්, වඩා හොඳ කේතයක් ඉදිරිපත් කිරීමේ උනන්දුව ඇතිව, මම පිළිතුර යාවත්කාලීන කර ඇත.
ඉවාන් ලැන්ග්ලොයිස්

1
UzFuzzyLogic - ඔබේ අදහස් දැක්වීමේ කේතය ඉවත් කිරීමට මම මිනිත්තු කිහිපයක් උත්සාහ කළෙමි. යම් කේතයක් නිසියාකාරව සංයුති කිරීමට නොහැකි විවරණයකට ඇසුරුම් කිරීම සඳහා එය (සිත්ගන්නාසුළු) උත්සාහයකි. එය තවමත් කරන්නේ කුමක්ද යන්න හෝ වඩාත් වැදගත් ලෙස එය ඔබගේ (නිවැරදි) ප්‍රකාශයට සහය දක්වන්නේ මන්දැයි මම තවමත් හදුනාගෙන නැත.
ජෝ

113

ටීඑල්; ඩීආර්: ඒ වෙනුවට මෙය කරන්න

විධානයක් මැද තර්ක ඉදිරිපත් කිරීම සඳහා අන්වර්ථයකට වඩා ශ්‍රිතයක් භාවිතා කිරීම වඩා පහසු සහ කියවිය හැකි ය.

$ wrap_args() { echo "before $@ after"; }
$ wrap_args 1 2 3
before 1 2 3 after

ඔබ කියවන්නේ නම්, ෂෙල් තර්ක සැකසීම ගැන ඔබ දැනගත යුතු නැති දේවල් ඔබ ඉගෙන ගනු ඇත. දැනුම භයානක ය. අඳුරු පැත්ත සදහටම ඔබේ ඉරණම පාලනය කිරීමට පෙර ඔබට අවශ්‍ය ප්‍රති come ලය ලබා ගන්න.

පැහැදිලි කිරීම

bashයළි-යොමුවීම් කරන්න තර්ක පිළිගන්න නමුත්, පමණක් අවසන් :

$ alias speak=echo
$ speak hello world
hello world

විධාන මැදට තර්ක ඉදිරිපත් aliasකිරීම සැබවින්ම හැකි නමුත් එය කැත වේ.

නිවසේදී මෙය උත්සාහ නොකරන්න, පැටියෝ!

ඔබ සීමාවන් ඉක්මවා වෙනත් අය කියන දේ කිරීමට කැමති නම්, මෙන්න වට්ටෝරුව. ඔබේ කොණ්ඩය කැළැල් වී ඔබේ මුහුණ පිස්සු-විද්‍යා-ශෛලියකින් වැසී ඇත්නම් මට දොස් නොකියන්න.

මෙහි ප්‍රති ar ලය aliasවනුයේ අවසානයේ පමණක් පිළිගන්නා තර්ක එතීමකට යවා ඒවා මැදට ඇතුළු කර ඔබේ විධානය ක්‍රියාත්මක කිරීමයි.

විසඳුම 1

ඔබ සැබවින්ම ශ්‍රිතයක් භාවිතා කිරීමට විරුද්ධ නම්, ඔබට මෙය භාවිතා කළ හැකිය:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

ඔබ විස්ථාපනය කල හැකි $@සමග $1පමණක් ඔබ පළමු තර්කය අවශ්ය නම්.

පැහැදිලි කිරීම 1

මෙය තාවකාලික ශ්‍රිතයක් නිර්මාණය කරයි f, එය තර්ක සම්මත කරයි (සටහන fඅවසානයේ කැඳවනු ලැබේ). මෙම unset -fඑය පසුව බැහැලා නැත එසේ යන අන්වර්ථ ක්රියාත්මක වන ලෙස මෙම උත්සවය අර්ථ දැක්වීම ඉවත් කරයි.

විසඳුම 2

ඔබට උපසිරැසියක් ද භාවිතා කළ හැකිය:

$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'

පැහැදිලි කිරීම 2

අන්වර්ථය මෙවැනි විධානයක් සාදයි:

sh -c 'echo before "$@" after' _

අදහස්:

  • ස්ථාන දරන්නා _අවශ්‍යයි, නමුත් එය ඕනෑම දෙයක් විය හැකිය. එය sh's' ලෙස සකසා $0ඇති අතර, එමඟින් පරිශීලකයා විසින් ලබා දෙන පළමු තර්ක පරිභෝජනය නොකිරීමට අවශ්‍ය වේ. නිරූපණය:

    sh -c 'echo Consumed: "$0" Printing: "$@"' alcohol drunken babble
    Consumed: alcohol Printing: drunken babble
  • තනි උපුටා දැක්වීම් ඇතුළත තනි උපුටා දැක්වීම් අවශ්‍ය වේ. ද්විත්ව උපුටා දැක්වීම් සමඟ එය ක්‍රියා නොකිරීම පිළිබඳ උදාහරණයක් මෙන්න:

    $ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble
    Consumed: -bash Printing:

    මෙහිදී අන්තර්ක්‍රියාකාරී කවචයේ අගයන් $0සහ එය සම්මත කිරීමට පෙර$@ උපුටා ගත් ද්විත්වයට ප්‍රතිස්ථාපනය වේ . මෙන්න සාක්ෂි:sh

    echo "Consumed: $0 Printing: $@"
    Consumed: -bash Printing:

    තනි උපුටා දැක්වීම් මඟින් මෙම විචල්‍යයන් අන්තර්ක්‍රියාකාරී කවචය මගින් අර්ථ නිරූපණය නොකෙරෙන අතර ඒවා වචනාර්ථයෙන් සම්මත වේ sh -c.

    ඔබට ද්විත්ව උපුටා දැක්වීම් භාවිතා කළ හැකි \$@නමුත් හොඳම ක්‍රමය වන්නේ ඔබේ තර්ක උපුටා දැක්වීමයි (ඒවා අවකාශයන් අඩංගු විය හැකි බැවින්), \"\$@\"එය වඩාත් අවලස්සන පෙනුමක් ඇති නමුත්, කෙස් කළඹට ඇතුළුවීම සඳහා පූර්වාවශ්‍යතාවක් වන අපැහැදිලි තරඟයක් ජය ගැනීමට ඔබට උදව් වනු ඇත.


2
විසඳුම 1 සඳහා, ඔබ තනි උපුටා දැක්වීම් භාවිතා කරන බවට වග බලා ගන්න, around around around around අවට වළකින්න. ඔබට එය අවශ්‍ය නම් ඉතා ප්‍රයෝජනවත් තාක්‍ෂණයකි.
sgtz

විසඳුම 1 මට අවශ්‍ය සෑම සේවාදායකයක් සඳහාම තර්ක සමඟ rdesktop-vrdp ඔතා.
හ්සෙඩාර්

අවසානයේ තර්ක පිළිගැනීම හරියටම "git checkout {branchname}" වෙනුවට සරල "gc {branchname}" වෙනුවට ආදේශ කිරීමට මට අවශ්‍ය විය. .Bash_profile හි මට සරලවම එකතු කිරීමට සිදුවියalias gc='git checkout'
AbstractVoid

gsgtz ඔබට අවට මිල ගණන් ඉවත් කිරීමට අවශ්‍ය ඇයි $@? ඔබට අවශ්‍ය නම් ඒවා අවශ්‍ය වේ, උදා: ඒවායේ ඉඩ ඇති ලිපිගොනු.
ටොම් හේල්

1
Lex ඇලෙක්සිස්විල්කේ හරියටම. ඊටත් වඩා පහසු නම්, ඔබට සරලව භාවිතා කළ හැකිය\df
BUFU

39

විකල්ප විසඳුමක් නම් මාකර් මෑතකදී භාවිතා කළ මෙවලමක් වන අතර එය විධාන සැකිලි "පිටු සලකුණු" කිරීමට සහ විධාන ස්ථාන දරන්නන්ට පහසුවෙන් කර්සරය තැබීමට ඉඩ සලසයි:

විධාන රේඛාව

බොහෝ විට මම ෂෙල් ශ්‍රිත භාවිතා කරන බව මට පෙනී ගියේය, එබැවින් නිතර භාවිතා කරන විධාන විධාන රේඛාවේ නැවත නැවතත් ලිවීමට අවශ්‍ය නැත. මෙම භාවිත අවස්ථාව සඳහා ශ්‍රිත භාවිතා කිරීමේ ගැටළුව නම්, මගේ විධාන වචන මාලාවට නව පද එකතු කිරීම සහ තාත්වික විධානයෙහි පරාමිතීන් යොමු කරන ශ්‍රිතයන් මතක තබා ගැනීමයි. මාකර් ඉලක්කය වන්නේ එම මානසික බර ඉවත් කිරීමයි.


16

ඔබ කළ යුත්තේ අන්වර්ථයක් තුළ ශ්‍රිතයක් කිරීම පමණි:

$ alias mkcd='_mkcd(){ mkdir "$1"; cd "$1";}; _mkcd'

තනි මිල ගණන් ක්‍රියාත්මක නොවන නිසා ඔබ "$ 1" වටා ද්විත්ව මිල ගණන් තැබිය යුතුය .


5
එය දක්ෂයි, නමුත් ප්‍රශ්නය අන්වර්ථයක් සෑදීමට නියම කර ඇති කාරණය හැරුණු විට, මුලදී අන්වර්ථ නාමයට සමාන නමක් සමඟ පමණක් ක්‍රියා නොකිරීමට හේතුවක් තිබේද?
xaxxon

1
axxaxxon ඇත්ත වශයෙන්ම නොවේ, නමුත් එය අන්වර්ථයක් භාවිතා කිරීමට මා දන්නා පහසුම ක්‍රමය මිස ශ්‍රිතයක් නොවේ.
කෙන් ට්‍රාන්

1
මෙය ක්‍රියාත්මක නොවේ. උබුන්ටු 18 හි මට දෝෂයක් ඇතිවිය bash: syntax error near unexpected token '{mkdir'.
ෂිටාල් ෂා

1
මම සින්ටැක්ස් ගැටළු විසඳා ඇත. Re: functionඋපසර්ගය ඉවත් කිරීම , wiki.bash-hackers.org/scripting/obsolete හි සාකච්ඡාව බලන්න . එයින් කියැවෙන්නේ, කිසියම් ශ්‍රිතයක් නිර්වචනය කිරීමට පමණක් නොව අන්වර්ථයක් භාවිතා නොකිරීමට කිසිවෙකු මෙය කරන්නේ මන්දැයි මම නොදනිමි.
චාල්ස් ඩෆි

1
arafaramir ඔබට භාවිතා කළ හැකිය command. ඔබට අන්වර්ථයක් භාවිතා කර alias c = 'command'සරලව භාවිතා කළ හැකිය c ls.
බුෆු

10

මෙහි මා සතුව ඇති කාර්යයන් සඳහා උදාහරණ තුනක් ඇත ~/.bashrc, ඒවා අත්‍යවශ්‍යයෙන්ම පරාමිතියක් පිළිගන්නා අන්වර්ථයන් වේ:

#Utility required by all below functions.
#/programming/369758/how-to-trim-whitespace-from-bash-variable#comment21953456_3232433
alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'"

.

:<<COMMENT
    Alias function for recursive deletion, with are-you-sure prompt.

    Example:
        srf /home/myusername/django_files/rest_tutorial/rest_venv/

    Parameter is required, and must be at least one non-whitespace character.

    Short description: Stored in SRF_DESC

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*rm -r*:srf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - y/n prompt: https://stackoverflow.com/a/3232082/2736496
    - Alias w/param: https://stackoverflow.com/a/7131683/2736496
COMMENT
#SRF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
SRF_DESC="srf [path]: Recursive deletion, with y/n prompt\n"
srf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    #Actual line-breaks required in order to expand the variable.
    #- https://stackoverflow.com/a/4296147/2736496
    read -r -p "About to
    sudo rm -rf \"$param\"
Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        sudo rm -rf "$param"
    else
        echo "Cancelled."
    fi
}

.

:<<COMMENT
    Delete item from history based on its line number. No prompt.

    Short description: Stored in HX_DESC

    Examples
        hx 112
        hx 3

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HX_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HX_DESC="hx [linenum]: Delete history item at line number\n"
hx()  {
    history -d "$1"
}

.

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Short description: Stored in HXF_DESC

    Examples
        hxf "rm -rf"
        hxf ^source

    Parameter is required, and must be at least one non-whitespace character.

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*hxf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HXF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HXF_DESC="hxf [searchterm]: Delete all history items matching search term, with y/n prompt\n"
hxf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    read -r -p "About to delete all items from history that match \"$param\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        grep -v "$param" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        history -c

        #Overwrite the actual history file with the temp one.
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

යොමුව:


හහ්? එය ශ්‍රිතයක් මිස අන්වර්ථයක් නොවේ. ඔබේ එක් යොමු කිරීමක් මෙම ප්‍රශ්නයයි.
ත්‍රිත්ව

2
නැත, එය හරියටම ශ්‍රිතයක් මෙන් ක්‍රියා කරයි. මෙහි ඇති පිළිතුරු කිහිපයක් පැහැදිලි කරන පරිදි, ඔබට පරාමිතියක් ගන්නා අන්වර්ථයක් සෑදිය නොහැක. ඔබට කළ හැක්කේ ශ්‍රිතයක් ලිවීමයි, එය ඔබ කර ඇති දෙයයි.
ත්‍රිත්ව

1
ඔබේ අදහස් කියවීමට පෙර, මගේ අන්වර්ථ දෘෂ්ටි කෝණයෙන්, එය අන්වර්ථයක් (එකක් නිර්මාණය කිරීමට විකල්ප ක්‍රමයක්) යැයි මම සිතුවෙමි. මට කිව හැකි තාක් දුරට එය හරියටම ක්‍රියාත්මක වේ. එය අවශ්යයෙන් මම පාරිභාෂිතය දා මම පවා නම්, පරාමිතිය පිළිගන්නා අන්වර්ථ. මට ගැටලුව නොපෙනේ. මෙම ගැටලුවේ අනෙක් පිළිතුරට සබැඳිය මම පැහැදිලි කර ඇත්තෙමි. මෙය මට මෙය නිර්මාණය කිරීමට උපකාරී විය.
aliteralmind

1
සමහර විට මෙය "පරාමිතියක් පිළිගන්නා බාෂ් අන්වර්ථයක්" යන ප්‍රශ්නයට නිශ්චිතවම පිළිතුරු සපයන්නේ නැත, මන්ද එය කළ නොහැකි බව මට දැන් වැටහී ඇති නමුත් එය නිසැකවම එයට effectively ලදායී ලෙස පිළිතුරු සපයයි. මට මෙහි නැති වී ඇත්තේ කුමක්ද?
aliteralmind

2
මෙහි හොඳ උදාහරණ කිහිපයක් සහ මනාව අදහස් දැක්වූ කේතය. මෙම පිටුවට පැමිණෙන පුද්ගලයින් සඳහා විශාල උපකාරයක්.
චිම්

10

Bash අන්වර්ථය නියත වශයෙන්ම පරාමිතීන් පිළිගනී. යෙදුමේ නම පරාමිතියක් ලෙස පිළිගන්නා නව ප්‍රතික්‍රියා යෙදුමක් නිර්මාණය කිරීම සඳහා මම අන්වර්ථයක් එක් කළෙමි. මෙන්න මගේ ක්‍රියාවලිය:

නැනෝ භාෂාවෙන් සංස්කරණය කිරීම සඳහා bash_profile විවෘත කරන්න

nano /.bash_profile

ඔබේ අන්වර්ථ නාම එක් කරන්න, එක් පේළියකට එකක්:

alias gita='git add .'
alias gitc='git commit -m "$@"'
alias gitpom='git push origin master'
alias creact='npx create-react-app "$@"'

සටහන: "$ @" "මගේ නව-යෙදුම නිර්මාණය කරන්න" වැනි සම්මතයන් පිළිගනී.

නැනෝ සංස්කාරකය සුරකින්න සහ පිටවන්න

ලිවීමට ctrl + o (Enter යතුර ඔබන්න); පිටවීමට ctrl + x

.Bash_profile හි නව අන්වර්ථයන් භාවිතා කිරීමට පර්යන්තයට කියන්න

source /.bash_profile

ඒක තමයි! ඔබට දැන් ඔබගේ නව අන්වර්ථ නාම භාවිතා කළ හැකිය


9

අන්වර්ථයක් මධ්‍යයේ ඔබට පරාමිතියක් ඇතුළත් කළ නොහැකි යැයි පවසන සියල්ලන්ටම ගෞරවයෙන් මම එය පරීක්ෂා කර බැලූ විට එය ක්‍රියාත්මක වූ බව සොයා ගත්තා.

alias mycommand = "python3" $ 1 "script.py --folderoutput RESULTS /"

මම පසුව mycommand foobar ධාවනය කරන විට එය හරියටම ක්‍රියා කළේ මම විධානය දිගු වේලාවක් ටයිප් කළාක් මෙනි.


නියත වශයෙන්ම, අන්වර්ථයට පරාමිතීන් ලබා ගත හැකිය, මම මෙය භාවිතා කරන්නේ උදා: උදා: අන්වර්ථය
බැඳීම

2
මට වැඩ කරන්නේ නැත: මට alias myalias="echo 1 "$1" 3"; myalias 2ලබා දෙයි:1 3 2
dirdi

" Csh හි මෙන් ආදේශන පා in යේ තර්ක භාවිතා කිරීමේ යාන්ත්‍රණයක් නොමැත" gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Aliases ඔබේ විධානය බොහෝ විට ක්‍රියාත්මක වන්නේ ඔබ අවසානයේ $ 1 ට දැමූ ඕනෑම දෙයක් එකතු කිරීම නිසා විය හැකිය. එම cmd රේඛාවේ ඔබ කරන ඕනෑම දෙයක් සඳහා තවමත් ක්‍රියා කරයි.
Fizz

ඔබටම ඒත්තු ගැන්වීම සඳහා අන්වර්ථ පේළි පුළුල් කළ හැකිය superuser.com/a/247781/345617
Fizz

7

එක් පරාමිතියක් එකක් හෝ දෙකක් හෝ වෙනත් දෘඩ කේත කරන ලද ප්‍රමාණයක් පමණක් නොව, ශ්‍රිතයක් සඳහා සියලු පරාමිතීන් යෙදීම සඳහා ඔබ සාමාන්‍ය ක්‍රමයක් සොයන්නේ නම්, ඔබට එය මේ ආකාරයෙන් කළ හැකිය:

#!/usr/bin/env bash

# you would want to `source` this file, maybe in your .bash_profile?
function runjar_fn(){
    java -jar myjar.jar "$@";
}

alias runjar=runjar_fn;

එබැවින් ඉහත උදාහරණයේ දී මම runjarඅන්වර්ථය වෙත දිවෙන විට සිට සියලු පරාමිතීන් පසු කරමි .

උදාහරණයක් ලෙස, මම එසේ කළහොත් runjar hi thereඑය සැබවින්ම ක්‍රියාත්මක වනු ඇත java -jar myjar.jar hi there. මම කළා නම් runjar one two threeඑය ක්‍රියාත්මක java -jar myjar.jar one two threeවේ.

මම මේ $@පදනම් කරගත් විසඳුමට කැමතියි එය ඕනෑම පරාමිති ගණනක් සමඟ ක්‍රියා කරන නිසා.


4
ශ්‍රිතයට runjarඅන්වර්ථයක් කිරීම වෙනුවට ශ්‍රිතය නම් නොකරන්නේ ඇයි ? අනවශ්‍ය ලෙස සංකීර්ණ බවක් පෙනේ!
ඉවාන් ලැන්ග්ලොයිස්

Van ඊවාන් ලැන්ග්ලොයිස් කාර්යයන් ස්වයංක්‍රීයව alias-එසේ (හෝ දේවල් වල ගුණාංග සහිතව alias) බාෂ් ලිපිගොනු වල තිබේද? ඔව් නම්, එය මා නොදැන සිටීමයි
මීකා

ඔබ අදහස් කරන දේ තේරුම් ගන්න එපා. අන්වර්ථයක් යනු වෙනත් නමකි, එය පුද්ගලයෙකු හෝ ශ්‍රිතයක් වේවා. ඉතින්, ඔබ ශ්‍රිතයක් සෑදුවා, පසුව ඔබ ශ්‍රිතය සඳහා දෙවන නමක් සෑදුවා. අන්වර්ථය පිළිබඳ විශේෂ දෙයක් නොමැත, එහි දෙවන නම පමණක් අවශ්‍ය නොවේ. විධාන රේඛාවේ ඔබ ටයිප් කරන දේ අභ්‍යන්තර හෝ බාහිර කාර්යයන් විය හැකිය, එබැවින් "ශ්‍රිතය" නව විධානයක් කරයි, අන්වර්ථ නොවේ.
ඉවාන් ලැන්ග්ලොයිස්

4
මෙය අර්ථ විරහිත ය. එය සමාන ය alias runjar='java -jar myjar.jar'. අන්වර්ථයන් තර්ක පිළිගනී, නමුත් අවසානයේ පමණි.
ටොම් හේල්

6

සැ.යු. එසේම, අඩුපාඩු තිබේ (එය පැහැදිලිව පෙනේ යැයි මම සිතුවෙමි , නමුත් ඔබ ව්‍යාකූල වී ඇත්නම්: ඒවා ඇත්ත වශයෙන්ම භාවිතා කිරීමට අදහස් නොකෙරේ ... ඕනෑම තැනක!)

.................................................. .................................................. ............................................

මම මීට පෙර මෙයට පිළිතුරු දී ඇති අතර එය අතීතයේ දී සෑම විටම මේ ආකාරයට විය:

alias foo='__foo() { unset -f $0; echo "arg1 for foo=$1"; }; __foo()'

ඔබ සියල්ලම එකට භාවිතා කිරීමෙන් වැළකී සිටින්නේ නම් මිස එය හොඳ සහ හොඳයි. පෙළ හරවා යැවීමේ බාෂ්ගේ අතිමහත් හැකියාවෙන් ඔබට ප්‍රයෝජන ගත හැක්කේ එවැනි අවස්ථාවකදී ය:

alias bar='cat <<< '\''echo arg1 for bar=$1'\'' | source /dev/stdin'

ඔවුන් දෙදෙනාම එකම දිගකින් යුක්ත වන අතර අක්ෂර කිහිපයක් දෙන්න හෝ ගන්න.

එම සැබෑ ගියුලියාන් කාලය වෙනස, මෙම 'උත්සවය ක්රමය' සහ 'යළි-යොමුවීම් මූලාශ්ර' ක්රමයක් අත්හදා පහළ වීම ඉහළ වේ. මෙම න්‍යාය සනාථ කිරීම සඳහා, කාලය තමාටම කියා ගනී:

arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.004s sys 0m0.008s  # <--time spent in foo
 real 0m0.000s user 0m0.000s sys 0m0.000s  # <--time spent in bar
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.000s sys 0m0.012s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.012s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.008s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE

ප්‍රති results ල 200 ක පමණ පහළ කොටස මෙයයි, අහඹු ලෙස සිදු කරනු ලැබේ. ක්‍රියාකාරීත්වය නිර්මාණය කිරීම / විනාශ කිරීම යළි හරවා යැවීමට වඩා වැඩි කාලයක් ගත වන බව පෙනේ. මෙම ප්‍රශ්නයට අනාගත අමුත්තන්ට මෙය උපකාරී වනු ඇතැයි අපේක්‍ෂා කරමු (එය මා වෙත තබා ගැනීමට අවශ්‍ය නොවීය).


2
ශ්‍රිතයක් නිර්වචනය කරන අන්වර්ථයක් තිබීම, එම ශ්‍රිතය ක්‍රියාත්මක කිරීම මෝඩකමකි. ශ්‍රිතයක් ලියන්න. සෑම කාර්යයක් සඳහාම පාහේ අන්වර්ථයන් ෂෙල් ශ්‍රිත මගින් අභිබවා යයි.
ගීර්හා

1
දෙවැන්න (බාර් අන්වර්ථය) අතුරු ආබාධ කිහිපයක් ඇත. පළමුව විධානයට stdin භාවිතා කළ නොහැක. දෙවනුව, අන්වර්ථයෙන් පසුව කිසිදු තර්කයක් සපයා නොමැති නම්, කවචය සිදු වුවහොත් කුමන තර්ක විතර්ක සම්මත වේ. ශ්‍රිතයක් භාවිතා කිරීමෙන් මෙම සියලු අතුරු ආබාධ වළක්වයි. (එසේම බළලුන්ගේ නිෂ් less ල භාවිතය).
ගීර්හා

2
හේයි මම කවදාවත් කිව්වේ නැහැ මේ කිසිවක් කිරීම හොඳ අදහසක් කියා, මම කිව්වේ ඒ සඳහා වෙනත් ක්‍රමද තිබෙන බවයි - මෙහි ඇති ප්‍රධාන අදහස නම් ඔබ අන්වර්ථ නාමවල කාර්යයන් භාවිතා නොකළ යුතු බවයි. යළි-යොමුවීම්, මම බව පැහැදිලි වනු ඇත නමුත් මම (මම මුලින්ම ඒක කලේ නම් ඕනෑවට වඩා පුම්බා කරමින් මම ද එම තනතුර සඳහා පත්කෙළේ ලබා ඇති) සෑම දෙනාටම එය විග්රහ කිරීම ඇති අනුමාන කල්පනා
osirisgothra

1
තීරුවේ වේලාවන් සියල්ලම 0 වන බැවින්, කවචය මෙය නිවැරදිව වේලාවට නොගන්නේ යැයි මම සැක කරමි. විධානය ක්‍රියාත්මක වීමට පෙර කාල පණිවිඩය මුද්‍රණය කර ඇති බව සැලකිල්ලට ගන්න. එර්ගෝ, එය කිසි විටෙකත් වාර ගණනක් කර පසුව බාර්එක සිදු කරයි, එබැවින් ඔබ කිසිසේත් තීරුව මනින්නේ නැත. වඩා සංකීර්ණ දෙයක් කරන්න, නැතහොත් බාර්එකෙහි විශාල ලූපයක් කරන්න එවිට ඔබට කිසිවක්
ඉවාන් ලැන්ග්ලොයිස්

1
මම දැන් මෙය අත්හදා බැලුවෙමි (අවසාන __foo () __foo මගින් ප්‍රතිස්ථාපනය කිරීමට මට සිදු වුවද). time for i in {1..1000}; do foo FOOVALUE; doneM 0m0.028s. නමුත් time for i in {1..1000}; do bar FOOVALUE; donem 0m2.739s. තීරුව යනු foo ට වඩා මන්දගාමී විශාලත්වයේ ඇණවුම් දෙකකි . යන්තම් ඒ වෙනුවට අන්වර්ථ ක සරල කාර්යය භාවිතා තවත් 30% ක් විසින් ධාවන අඩු: function boo() { echo "arg1 for boo=$1" ; }time for i in {1..1000}; do boo FOOVALUE; doneඇතුළුවන්න → 0m0.019s.
ආර්න් බාබෙන්හවුසර්හයිඩ්

4

අත්තනෝමතික තර්ක විස්ථාපනය කිරීමට යාන්ත්‍රණයක් නොමැති බැෂ් අන්වර්ථයේ ගැටලුවට සාමාන්‍ය විසඳුමක් ලබා ගැනීමට නීත්‍යානුකූල තාක්ෂණික හේතු තිබේ. එක් හේතුවක් නම්, ඔබ ක්‍රියාත්මක කිරීමට බලාපොරොත්තු වන විධානය ශ්‍රිතයක් ක්‍රියාත්මක කිරීමෙන් ඇතිවන පරිසරයේ සිදුවන වෙනස්කම් වලට අහිතකර ලෙස බලපානු ඇත. අනෙක් සියලුම අවස්ථාවන්හිදී, කාර්යයන් භාවිතා කළ යුතුය.

මේ සඳහා විසඳුමක් ලබා දීමට මෑතකදී මට බල කෙරුනේ, විචල්‍යයන් සහ ශ්‍රිතයන්ගේ අර්ථ දැක්වීම් මුද්‍රණය කිරීම සඳහා කෙටි විධාන කිහිපයක් නිර්මාණය කිරීමට මට අවශ්‍ය වීමයි. ඒ නිසා මම ඒ සඳහා කාර්යයන් කිහිපයක් ලිව්වා. කෙසේ වෙතත්, සමහර විචල්‍යයන් ඇත, ඒවා ශ්‍රිත ඇමතුමකින්ම වෙනස් වේ (හෝ විය හැකිය). ඒවා අතර:

FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV

විචල්‍ය defns මුද්‍රණය කිරීම සඳහා මා භාවිතා කළ මූලික විධානය (ශ්‍රිතයක). set විධානය මඟින් ආකෘති ප්‍රතිදානයේදී:

sv () { set | grep --color=never -- "^$1=.*"; }

උදා:

> V=voodoo
sv V
V=voodoo

ගැටලුව: මෙය ඉහත සඳහන් විචල්‍යයන්ගේ අර්ථකථන වත්මන් සන්දර්භය තුළ මුද්‍රණය නොකෙරේ , උදා: අන්තර්ක්‍රියාකාරී ෂෙල් විමසුමක් තුළ (හෝ කිසිදු ක්‍රියාකාරී ඇමතුමක නොවේ නම්), FUNCNAME අර්ථ දක්වා නැත. නමුත් මගේ ක්‍රියාකාරිත්වය මට වැරදි තොරතුරු කියයි:

> sv FUNCNAME
FUNCNAME=([0]="sv")

මා විසින් ඉදිරිපත් කරන ලද එක් විසඳුමක් අනෙක් අය විසින් මෙම මාතෘකාව පිළිබඳ සඳහන් කර ඇත. විචල්ය defns., සහ එක් තර්කයක් පමණක් අවශ්ය වන මෙම නිශ්චිත විධානය සඳහා මම මෙය කළෙමි:

alias asv='(grep -- "^$(cat -)=.*" <(set)) <<<'

එමඟින් නිවැරදි ප්‍රතිදානය (කිසිවක් නැත) සහ ප්‍රති result ල තත්ත්වය (අසත්‍යය) ලබා දෙයි:

> asv FUNCNAME
> echo $?
1

කෙසේ වෙතත්, අත්තනෝමතික තර්ක ගණනකට විසඳුම් සෙවීමට මට තවමත් බල කෙරුනි.

අත්තනෝමතික තර්ක විග්‍රහ කිරීම සඳහා පොදු විසඳුමක්:

# (I put this code in a file "alias-arg.sh"):

# cmd [arg1 ...] – an experimental command that optionally takes args,
# which are printed as "cmd(arg1 ...)"
#
# Also sets global variable "CMD_DONE" to "true".
#
cmd () { echo "cmd($@)"; declare -g CMD_DONE=true; }

# Now set up an alias "ac2" that passes to cmd two arguments placed
# after the alias, but passes them to cmd with their order reversed:
#
# ac2 cmd_arg2 cmd_arg1 – calls "cmd" as: "cmd cmd_arg1 cmd_arg2"
#
alias ac2='
    # Set up cmd to be execed after f() finishes:
    #
    trap '\''cmd "${CMD_ARGV[1]}" "${CMD_ARGV[0]}"'\'' SIGUSR1;
    #        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    #       (^This is the actually execed command^)
    #
    # f [arg0 arg1 ...] – acquires args and sets up trap to run cmd:
    f () {
        declare -ag CMD_ARGV=("$@");  # array to give args to cmd
        kill -SIGUSR1 $$;             # this causes cmd to be run
        trap SIGUSR1;                 # unset the trap for SIGUSR1
        unset CMD_ARGV;               # clean up env...
        unset f;                      # incl. this function!
    };
    f'  # Finally, exec f, which will receive the args following "ac2".

උදා:

> . alias-arg.sh
> ac2 one two
cmd(two one)
>
> # Check to see that command run via trap affects this environment:
> asv CMD_DONE
CMD_DONE=true

මෙම විසඳුම පිළිබඳ හොඳ දෙයක් නම්, කොටු වූ විධානය රචනා කිරීමේදී විධාන සඳහා ස්ථානීය පරාමිතීන් (තර්ක) හැසිරවීමට භාවිතා කරන සියලුම විශේෂ උපක්‍රම ක්‍රියාත්මක වනු ඇත. එකම වෙනස වන්නේ අරාව සින්ටැක්ස් භාවිතා කළ යුතු බවයි.

උදා,

ඔබට "$ @" අවශ්‍ය නම්, "$ {CMD_ARGV [@] use" භාවිතා කරන්න.

ඔබට "$ #" අවශ්‍ය නම්, "$ {# CMD_ARGV [@] use" භාවිතා කරන්න.

ආදිය.


4

වරක් මම විනෝදජනක ව්‍යාපෘතියක් කළ අතර මම තවමත් එය භාවිතා කරමි. cpවිධාන කෝස් හරහා ලිපිගොනු පිටපත් කරන අතර එය කිසියම් සජීවීකරණයක් cpපෙන්වන අතර කිසිවක් නොපෙන්වන අතර එය එක්තරා ආකාරයක කලකිරීමකි. ඉතින් මම මේ අන්වර්ථය හැදුවා

alias cp="~/SCR/spiner cp"

මේ දඟ පන්දු යවන්නාගේ පිටපතයි

#!/bin/bash

#Set timer
T=$(date +%s)

#Add some color
. ~/SCR/color

#Animation sprites
sprite=( "(* )  ( *)" " (* )( *) " " ( *)(* ) " "( *)  (* )" "(* )  ( *)" )

#Print empty line and hide cursor
printf "\n${COF}"

#Exit function
function bye { printf "${CON}"; [ -e /proc/$pid ] && kill -9 $pid; exit; }; trap bye INT

#Run our command and get its pid
"$@" & pid=$!

#Waiting animation
i=0; while [ -e /proc/$pid ]; do sleep 0.1

    printf "\r${GRN}Please wait... ${YLW}${sprite[$i]}${DEF}"
    ((i++)); [[ $i = ${#sprite[@]} ]] && i=0

done

#Print time and exit
T=$(($(date +%s)-$T))
printf "\n\nTime taken: $(date -u -d @${T} +'%T')\n"

bye

ඒක මේ වගේ

රූප විස්තරය මෙහි ඇතුළත් කරන්න

චක්‍රීය සජීවිකරණය)

රූප විස්තරය මෙහි ඇතුළත් කරන්න


2

පරාමිතීන් ගැනීම සඳහා, ඔබ කාර්යයන් භාවිතා කළ යුතුය!

කෙසේ වෙතත් al al අන්වර්ථය ක්‍රියාත්මක කිරීමේදී සහ පැන යාම වෙනුවට අන්වර්ථය නිර්මාණය කිරීමේදී අර්ථ නිරූපණය කරන්න. මෙම ගැටළුව විසඳන්නේ කෙසේද?

මෙම ගැටළුවෙන් මිදීමට ඔබ අන්වර්ථයක් වෙනුවට ෂෙල් ක්‍රියාකාරිත්වය භාවිතා කළ යුතුය. ඔබට පහත පරිදි foo යන්න අර්ථ දැක්විය හැකිය:

function foo() { /path/to/command "$@" ;}

හෝ

foo() { /path/to/command "$@" ;}

අවසාන වශයෙන්, පහත දැක්වෙන වාක්‍ය ඛණ්ඩය භාවිතා කර ඔබේ foo () අමතන්න:

foo arg1 arg2 argN

ඔබගේ foo () ~/.bash_profileහෝ ~/.zshrcගොනුවට එක් කිරීමට වග බලා ගන්න .

ඔබේ නඩුවේදී, මෙය ක්‍රියාත්මක වනු ඇත

function trash() { mv $@ ~/.Trash; }

මට ඔබේ අදහස තේරෙන්නේ නැහැ. තර්ක අර්ථකථනය කරන විට එය වැදගත් නොවන බව මම සිතමි. අන්තිමට අන්තිමට ඔබට අවශ්‍ය තරම් පරාමිතීන් පිළිගන්න.
ටිමෝ

නමුත් කාර්යයන් සමඟ එය කිරීම වඩා හොඳය. අන්වර්ථයන් ඒ සඳහා අදහස් නොකෙරේ.
අහමඩ් අවයිස්

2

මෙන්න උදාහරණය:

alias gcommit='function _f() { git add -A; git commit -m "$1"; } ; _f'

ඉතා වැදගත්:

  1. පසු {හා පෙර අවකාශයක් }ඇත.
  2. ඒ නිසා එය ;අනුක්රමය එක් එක් විධානයට පසුව. අවසාන විධානයෙන් පසුව ඔබට මෙය අමතක වුවහොත්, >ඒ වෙනුවට ඔබ විමසනු ඇත!
  3. තර්කය උපුටා දැක්වීම්වල කොටා ඇත "$1"

2
ශ්‍රිතයකට අන්වර්ථයක් නිර්මාණය කිරීමේ අවශ්‍යතාවයක් නොමැත, ශ්‍රිතය කෙලින්ම භාවිතා කරන්න.
user3439894

1

මෑන් පිටුවේ මෙම උපුටා දැක්වීම මගින් දැනටමත් ප්‍රමාණවත් ලෙස දායක වී ඇති සහ සනාථ කර ඇති පරිදි කාර්යයන් ඇත්ත වශයෙන්ම සෑම විටම පාහේ පිළිතුරකි: "සෑම අරමුණක් සඳහාම අන්වර්ථයන් ෂෙල් ශ්‍රිත මගින් අභිබවා යයි."

සම්පූර්ණත්වය සඳහා සහ මෙය ප්‍රයෝජනවත් විය හැකි නිසා (තරමක් සැහැල්ලු වාක්‍ය ඛණ්ඩය) පරාමිතිය (අන්වර්ථය) අන්වර්ථය අනුගමනය කරන විට ඒවා තවමත් භාවිතා කළ හැකි බව සටහන් කළ හැකිය (මෙය OP හි අවශ්‍යතාවයට විසඳුම් නොදෙන නමුත්). මෙය උදාහරණයකින් නිරූපණය කිරීම පහසුය:

alias ssh_disc='ssh -O stop'

smth වැනි ටයිප් කිරීමට මට ඉඩ දෙයි ssh_disc myhost, එය අපේක්ෂිත පරිදි පුළුල් වේ:ssh -O stop myhost

සංකීර්ණ තර්ක විධාන සඳහා මෙය ප්‍රයෝජනවත් වේ (මගේ මතකය එය තවදුරටත් භාවිතා නොකරයි ...)


1

අනෙක් ඒවා මෙහි පෙන්වා ඇති පරිදි ශ්‍රිත සහ අන්වර්ථ යන දෙකටම පරාමිතීන් භාවිතා කළ හැකිය. මීට අමතරව, මම තවත් අංශ කිහිපයක් පෙන්වා දීමට කැමැත්තෙමි:

1. ශ්‍රිතය තමන්ගේම විෂය පථය තුළ ක්‍රියාත්මක වන අතර අන්වර්ථ කොටස් විෂය පථය

ඔබට යමක් සැඟවීමට හෝ නිරාවරණය කිරීමට අවශ්‍ය අවස්ථාවන්හි මෙම වෙනස දැන ගැනීම ප්‍රයෝජනවත් විය හැකිය. සංවර්‍ධනය සඳහා වඩා හොඳ තේරීම ශ්‍රිතයක් බව ද එය යෝජනා කරයි.

function tfunc(){
    GlobalFromFunc="Global From Func" # Function set global variable by default
    local FromFunc="onetwothree from func" # Set a local variable

}

alias talias='local LocalFromAlias="Local from Alias";  GlobalFromAlias="Global From Alias" # Cant hide a variable with local here '
# Test variables set by tfunc
tfunc # call tfunc
echo $GlobalFromFunc # This is visible
echo $LocalFromFunc # This is not visible
# Test variables set by talias
# call talias
talias
echo $GlobalFromAlias # This is invisible
echo $LocalFromAlias # This variable is unset and unusable 

ප්‍රතිදානය:

bash-3.2$     # Test variables set by tfunc
bash-3.2$     tfunc # call tfunc
bash-3.2$     echo $GlobalFromFunc # This is visible
Global From Func
bash-3.2$     echo $LocalFromFunc # This is not visible

bash-3.2$     # Test variables set by talias
bash-3.2$     # call talias
bash-3.2$     talias
bash: local: can only be used in a function
bash-3.2$     echo $GlobalFromAlias # This is invisible
Global From Alias
bash-3.2$ echo $LocalFromAlias # This variable is unset and unusable

2. රැප් ස්ක්‍රිප්ට් වඩා හොඳ තේරීමක්

පරිශීලක නාම හෝ බහු-පරිශීලක පරිසරය හරහා පිවිසීමේදීssh හෝ සම්බන්ධ වන විට අන්වර්ථයක් හෝ ශ්‍රිතයක් සොයාගත නොහැකි බව මට කිහිප වතාවක්ම සිදුවිය . මූලාශ්‍ර තිත් ලිපිගොනු සමඟ ඉඟි සහ උපක්‍රම තිබේ, නැතහොත් අන්වර්ථය සමඟ ඇති මෙම සිත්ගන්නාසුලු එකකි: alias sd='sudo 'මෙම පසු අන්වර්ථය alias install='sd apt-get install'අපේක්ෂා කළ පරිදි ක්‍රියා කිරීමට ඉඩ දෙයි (අමතර ඉඩ ප්‍රමාණය සැලකිල්ලට ගන්න sd='sudo '). කෙසේ වෙතත්, මේ ආකාරයේ අවස්ථාවන්හිදී ශ්‍රිතයකට හෝ අන්වර්ථයකට වඩා එතීමේ පිටපතක් හොඳින් ක්‍රියා කරයි. එතීෙම් ස්ක්‍රිප්ටයක ඇති ප්‍රධාන වාසිය නම්, එය අපේක්ෂිත මාවත යටතේ (එනම් / usr / loca / bin /) දෘශ්‍ය / ක්‍රියාත්මක කළ හැකි වීමයි. එහිදී ශ්‍රිතයක් / අන්වර්ථයක් භාවිතා කිරීමට පෙර එය ලබා ගත යුතුය. උදාහරණයක් ලෙස, ඔබ function / .bash_profile හෝ for / .bashrc සඳහා ශ්‍රිතයක් තබයිbash නමුත් පසුව වෙනත් මාරු වන්න (එනම්zsh) එවිට ශ්‍රිතය තවදුරටත් නොපෙනේ. එබැවින්, ඔබ සැක සහිත විට, එතීමේ පිටපතක් සෑම විටම වඩාත්ම විශ්වාසදායක සහ අතේ ගෙන යා හැකි විසඳුම වේ.


1
ක්‍රියාකාරී අනුවාදය ක්‍රියා නොකරන්නේ යැයි ඔබ සිතන්නේ ඇයි?
ත්‍රිත්ව

ripripleee. මම එය සංස්කරණය කර ඇත්තේ එය වඩාත් කියවිය හැකි වන පරිදි ය. "1. අන්වර්ථය ක්‍රියා කරයි, ක්‍රියා කරයි ..." යන මාතෘකාව යටතේ ක්‍රියාකාරී අනුවාදයක් ක්‍රියා නොකරන්නේ මන්දැයි මම නිදර්ශනය කළෙමි. සමහර විට ප්‍රශ්නයට කෙලින්ම පිළිතුරු දීමට, ශ්‍රිතය අන්වර්ථය නොමැති නව විෂය පථයක් හඳුන්වා දෙයි.
biocyberman

ඔබ කියනවා එය ක්‍රියාත්මක නොවන නමුත් මම ඔබව විශ්වාස කරන්නේ නැහැ. sourceශ්‍රිතයක හොඳින් ක්‍රියා කරයි.
ත්‍රිත්ව

1
f () { source /tmp/nst; }මම බලාපොරොත්තු වන දේ හරියටම කරනවා. සමහර විට ඔබ PATHවැරදියි, එබැවින් එය වැරදි activateහෝ වෙනත් දෙයක් ක්‍රියාත්මක කරයි; නමුත් sourceශ්‍රිතයකින් ධාවනය කිරීම හොඳින් ක්‍රියාත්මක වේ.
ත්‍රිත්ව

1
BTW, නැවත: functionඔබේ අර්ථ දැක්වීමේ මූල පදය භාවිතා කරමින් , wiki.bash-hackers.org/scripting/obsolete බලන්න - function funcname {පුරාණ ksh සින්ටැක්ස් බැෂ් යනු පෙර-පොසික්ස් ෂෙල් වෙඩි සමඟ පසුපසට ගැළපීම සඳහා සහාය වන අතර funcname() {නිල POSIX- ප්‍රමිතිගත සින්ටැක්ස් වේ. function funcname() {යනු පුරාණ ksh සමඟ නොගැලපෙන හෝ POSIX sh සමඟ නොගැලපෙන දෙකේ නොගැලපීමකි .
චාල්ස් ඩෆි

1

වෙනත් අය විසින් දැනටමත් පෙන්වා දී ඇති පරිදි, ශ්‍රිතයක් භාවිතා කිරීම හොඳම පුහුණුව ලෙස සැලකිය යුතුය.

කෙසේ වෙතත්, මෙන්න තවත් ප්රවේශයක්, උත්තේජනය කිරීම xargs:

alias junk="xargs -I "{}" -- mv "{}" "~/.Trash" <<< "

ධාරාවන් නැවත හරවා යැවීම සම්බන්ධයෙන් මෙය අතුරු ආබාධ ඇති බව සලකන්න.


1

ලිපිගොනු මකා දැමීම වෙනුවට කුණු කූඩයට ගෙනයාමට අන්වර්ථය නිර්මාණය කිරීම පිළිබඳ ප්‍රශ්නයට නිශ්චිත පිළිතුරක් ලබා දීම සඳහා:

alias rm="mv "$1" -t ~/.Trash/"

ඕෆ්කෝර්ස් ඔබ මුලින්ම නිර්මාණය කළ යුතුයි.

ඉන්පසු පහත විධානය දෙන්න:

$rm <filename>
$rm <dirname>

0

ඔබට කිසිවක් කිරීමට අවශ්‍ය නැත, අන්වර්ථය මෙය ස්වයංක්‍රීයව කරයි.

උදාහරණයක් ලෙස, මට git pull origin master පරාමිතිකරණය කිරීමට අවශ්‍ය නම්, මට පහත දැක්වෙන පරිදි අන්වර්ථයක් නිර්මාණය කළ හැකිය:

alias gpull = 'git pull origin '

ඇත්ත වශයෙන්ම එය අමතන විට, ඔබට 'මාස්ටර්' (ශාඛා නාමය) පරාමිතියක් ලෙස සම්මත කළ හැකිය,

gpull master
//or any other branch
gpull mybranch

මෙය ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත, මන්ද තර්කය නිදහසේ තැබිය නොහැකි නමුත් අවසානයේ පමණි.
dirdi
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.