මූලික වශයෙන්, එය අතේ ගෙන යා හැකි (සහ විශ්වසනීයත්වය) ගැටළුවකි.
මුලදී, echoකිසිදු විකල්පයක් භාර නොගත් අතර කිසිවක් පුළුල් නොකළේය. එය කරමින් සිටියේ එහි තර්ක අභ්යවකාශ අක්ෂරයකින් වෙන් කොට නව රේඛා අක්ෂරයකින් අවසන් කිරීමයි.
දැන්, යමෙකු සිතුවේ අපට echo "\n\t"නව රේඛා හෝ ටැබ් අක්ෂර ප්රතිදානය කිරීම වැනි දේවල් කළ හැකි නම් හොඳයි කියා හෝ නව රේඛා අක්ෂර ප්රතිදානය නොකිරීමට විකල්පයක් ඇති බවය.
ඔවුන් පසුව වඩා තදින් සිතුවත් එම ක්රියාකාරීත්වය කවචයට එකතු කරනවා වෙනුවට ( perlද්විත්ව උපුටා දැක්වීම් ඇතුළත, \tඇත්ත වශයෙන්ම ටැබ් අක්ෂරයක් අදහස් වේ), ඔවුන් එයට එකතු කළහ echo.
ඩේවිඩ් Korn කිරීමේ වරද අවබෝධ කරගත් ෂෙල් මිල කැඳවීම් නව ක්රමයක් හඳුන්වා: $'...'පසුව විසින් පිටපත් කරන ලද bashහා zshනමුත් එය ඒ වන විට මෙතෙක් ප්රමාද වුණා වැඩි ය.
දැන් සම්මත යුනික්ස් විට echoචරිත දෙකක් අඩංගු තර්කයක් ලැබෙන \හා tඔවුන් outputting වෙනුවට, එය ටැබ් අනුලකුණ ප්රතිදානයනට. එය \cතර්කයක් තුළ දුටු විගසම එය ප්රතිදානය කිරීම නවත්වයි (එබැවින් පසුපසින් එන නව රේඛාව ප්රතිදානය ද නොවේ).
වෙනත් ෂෙල් වෙඩි / යුනික්ස් වෙළෙන්දන් / අනුවාදයන් එය වෙනස් ආකාරයකින් කිරීමට තෝරා ගත්හ: ඔවුන් -eගැලවීමේ අනුපිළිවෙල පුළුල් කිරීමට -nවිකල්පයක් ද, පසුපසින් එන නව රේඛාව ප්රතිදානය නොකිරීමට විකල්පයක් ද එක් කළහ. සමහරුන්ට -Eගැලවීමේ අනුපිළිවෙල අක්රීය කිරීමට ඇත, සමහරක් -nඇතත් නැතත් -e, එක් echoක්රියාත්මක කිරීමකින් සහය දක්වන ගැලවීමේ අනුක්රම ලැයිස්තුව තවත් එකක් මඟින් අනුබල දෙන ආකාරයටම නොවේ.
ස්වේන් මැෂෙක්ට ලස්සන පිටුවක් ඇත, එය ගැටලුවේ තරම පෙන්වයි .
අය මත echoසහාය විකල්ප, එහි සාමාන්යයෙන් කිසිදු සහාය බව, නිර්මාණයන් --විකල්ප අවසන් (නිමිත්තෙන් echoසමහර-Bourne-වැනි නොවන ෂෙල් වෙඩි builtin කරන්න, zsh ආධාරක -බව වුවත් සඳහා), ඒ නිසා උදාහරණයකට කියනවා නම්, ප්රතිදාන අමාරුයි "-n"සමග echoදී බොහෝ ෂෙල් වෙඩි.
වැනි සමහර කටු මත bash¹ හෝ ksh93² හෝ yash( $ECHO_STYLEවිචල්ය), හැසිරීම පවා ෂෙල් සකස් කරන ආකාරය මත රඳා පවතී හෝ පරිසරය (GNU echo'නම් ගේ හැසිරීම ද වෙනස් වනු ඇත $POSIXLY_CORRECTපරිසරය තුල හා අනුවාදය සමඟ 4 , zshඑහි සමඟ ඇති bsd_echoවිකල්පය, සමහර pdksh පදනම් වී ඇත්තේ ඔවුන්ගේ posixවිකල්පය සමඟ හෝ ඒවා හැඳින්වුවද shනැතත්). එබැවින් bash echoඑකම අනුවාදයකින් s දෙකක් එකම bashලෙස හැසිරීමට සහතික නොවේ.
POSIX පවසයි: පළමු තර්කය -nහෝ කිසියම් තර්කයක බැක්ස්ලෑෂ් තිබේ නම්, හැසිරීම නිශ්චිතව දක්වා නැත . bashඒ අනුව දෝංකාරය POSIX නොවේ. උදාහරණයක් ලෙස POSIX අවශ්ය පරිදි echo -eප්රතිදානය නොකෙරේ -e<newline>. යුනික්ස් පිරිවිතරයන් වඩා දැඩි ය, එය තහනම් කර ඇති -nඅතර \cප්රතිදානය නැවැත්වීම ඇතුළුව සමහර ගැලවීමේ අනුපිළිවෙල පුළුල් කිරීම අවශ්ය වේ .
බොහෝ ක්රියාත්මක කිරීම් වලට අනුකූල නොවන බැවින් එම පිරිවිතරයන් මෙහි ගලවා ගත නොහැක. මැකෝස් 5 වැනි සමහර සහතික කළ පද්ධති පවා අනුකූල නොවේ.
වර්තමාන යථාර්ථය සැබවින්ම නිරූපණය කිරීම සඳහා, POSIX සැබවින්ම මෙසේ පැවසිය යුතුය : පළමු තර්කය ^-([eEn]*|-help|-version)$විස්තාරිත රීජෙක්ස්පීයට ගැලපෙන්නේ නම් හෝ කිසියම් තර්කයක් බැක්ස්ලෑෂ් අඩංගු වේ නම් (හෝ αBIG5 අක්ෂර කට්ටලය භාවිතා කරන ස්ථානවල මෙන් බැක්ස්ලෑෂ් චරිතයේ කේතන කේතනය එහි අක්ෂරවල අඩංගු වේ ), එවිට හැසිරීම නිශ්චිතව දක්වා නැත.
සියල්ලට ම, බැක්ස්ලෑෂ් අක්ෂර අඩංගු නොවන බවත්, ආරම්භ නොවන echo "$var"බවත් සහතික කළ නොහැකි නම්, ප්රතිදානය කරන්නේ කුමක් දැයි ඔබ නොදනී . POSIX පිරිවිතර ඇත්ත වශයෙන්ම අපට පවසන්නේ එම අවස්ථාවේ දී ඒ වෙනුවට භාවිතා කරන ලෙසයි.$var-printf
ඉතින් එයින් අදහස් කරන්නේ ඔබට echoපාලනය කළ නොහැකි දත්ත ප්රදර්ශනය කිරීමට භාවිතා කළ නොහැකි බවයි. වෙනත් වචන වලින් කිවහොත්, ඔබ ස්ක්රිප්ට් එකක් ලියන්නේ නම් සහ එය බාහිර ආදානය (පරිශීලකයාගෙන් තර්ක ලෙස හෝ ගොනු පද්ධතියෙන් ගොනු නම් ...) ගන්නේ නම්, ඔබට echoඑය ප්රදර්ශනය කිරීමට භාවිතා කළ නොහැක .
මෙය හරි:
echo >&2 Invalid file.
මෙය එසේ නොවේ:
echo >&2 "Invalid file: $file"
( සම්පාදනය කරන වේලාවේදී හෝ පරිසරය හරහා මෙන් විකල්පය එක් ආකාරයකින් හෝ වෙනත් ආකාරයකින් සක්රීය කර නොමැති විට එය echoවැනි (යුනික්ස් නොවන) සමහර ක්රියාත්මක කිරීම් සමඟ හොඳින් ක්රියා කරයි).bashxpg_echo
file=$(echo "$var" | tr ' ' _)බොහෝ නිර්මාණයන් (ව්යතිරේක වීම හරි නොවේ yashසමග ECHO_STYLE=raw(බව වරනයක් සමග yash'විචල්යයන් බයිට අත්තනෝමතික අනුක්රමය එසේ සහන නෑ ගොනු නම් පැවැත්වීමට නොහැකි ය) හා zshගේ echo -E - "$var"6 ).
printf, අනෙක් අතට වඩා විශ්වාසදායකය, අවම වශයෙන් එය මූලික භාවිතයට පමණක් සීමා වූ විට echo.
printf '%s\n' "$var"
එහි අඩංගු විය $varහැකි අක්ෂර නොසලකා නව රේඛා අක්ෂරයකින් පසුව අන්තර්ගතය ප්රතිදානය කරයි .
printf '%s' "$var"
නව රේඛා අක්ෂරයකින් තොරව එය ප්රතිදානය කරයි.
දැන්, printfක්රියාත්මක කිරීම අතර වෙනස්කම් ද තිබේ . POSIX විසින් නිශ්චිතව දක්වා ඇති විශේෂාංගවල හරයක් ඇත, නමුත් පසුව දිගු කිරීම් රාශියක් ඇත. නිදසුනක් ලෙස, සමහරු %qතර්ක උපුටා දැක්වීමට සහය දක්වයි, නමුත් එය සිදු කරන ආකාරය ෂෙල් සිට ෂෙල් දක්වා වෙනස් වේ, \uxxxxයුනිකෝඩ් අක්ෂර සඳහා සමහර සහාය . printf '%10s\n' "$var"බහු බයිට් ස්ථාන සඳහා හැසිරීම වෙනස් වේ , අවම වශයෙන් වෙනස් ප්රති three ල තුනක් වත් ඇතprintf %b '\123'
නමුත් අවසානයේදී, ඔබ POSIX විශේෂාංග කට්ටලයට ඇලී සිටින අතර ඒ සමඟ මනස්කාන්ත printfකිසිවක් කිරීමට උත්සාහ නොකරන්නේ නම්, ඔබ කරදරයකින් තොරය.
නමුත් පළමු තර්කය ආකෘතිය බව මතක තබා ගන්න, එබැවින් විචල්ය / පාලනය කළ නොහැකි දත්ත අඩංගු නොවිය යුතුය.
පහත පරිදි වඩාත් විශ්වාසදායක echoලෙස ක්රියාත්මක කළ හැකිය printf:
echo() ( # subshell for local scope for $IFS
IFS=" " # needed for "$*"
printf '%s\n' "$*"
)
echo_n() (
IFS=" "
printf %s "$*"
)
echo_e() (
IFS=" "
printf '%b\n' "$*"
)
උප කවචය (බොහෝ ෂෙල් ක්රියාවට නැංවීමේදී අමතර ක්රියාවලියක් ඇතිවීම එයින් ගම්ය වේ) local IFSබොහෝ ෂෙල් වෙඩි භාවිතා කිරීමෙන් වළක්වා ගත හැකිය , නැතහොත් එය ලිවීමෙන්:
echo() {
if [ "$#" -gt 0 ]; then
printf %s "$1"
shift
if [ "$#" -gt 0 ]; then
printf ' %s' "$@"
fi
fi
printf '\n'
}
සටහන්
1. ආකාරය bashගේ echoහැසිරීම වෙනස් කළ හැක.
සමග bash, ලකුණු අවස්ථාවේ දී, එහි පාලනය දේවල් දෙකක් හැසිරීම වේ echo(අසල enable -n echoහෝ නව අරුතක් echoඋත්සවයකට හෝ අන්වර්ථයක් ලෙසින්): මෙම xpg_echo bashවිකල්පය යන්න bashPOSIX මාදිලිය වේ. posixනම් මාදිලිය සක්රිය කළ හැකිය bashලෙස හැඳින්වේ shහෝ නම් POSIXLY_CORRECTපරිසරය තුළ හෝ සමග ය posixවිකල්පය:
බොහෝ පද්ධතිවල පෙරනිමි හැසිරීම:
$ bash -c 'echo -n "\0101"'
\0101% # the % here denotes the absence of newline character
xpg_echo යුනික්ස් අවශ්ය පරිදි අනුක්රමයන් පුළුල් කරයි:
$ BASHOPTS=xpg_echo bash -c 'echo "\0101"'
A
එය තවමත් ගෞරව කරන -nඅතර -e(සහ -E):
$ BASHOPTS=xpg_echo bash -c 'echo -n "\0101"'
A%
සමඟ xpg_echoසහ පොසික්ස් මාදිලිය:
$ env BASHOPTS=xpg_echo POSIXLY_CORRECT=1 bash -c 'echo -n "\0101"'
-n A
$ env BASHOPTS=xpg_echo sh -c 'echo -n "\0101"' # (where sh is a symlink to bash)
-n A
$ env BASHOPTS=xpg_echo SHELLOPTS=posix bash -c 'echo -n "\0101"'
-n A
මෙවර bashපොසික්ස් සහ යුනික්ස් යන දෙකම අනුකූල වේ. POSIX ප්රකාරයේදී, bashඑය ප්රතිදානය නොකරන බැවින් තවමත් POSIX අනුකූල නොවන බව සලකන්න -e:
$ env SHELLOPTS=posix bash -c 'echo -e'
$
Xpg_echo සහ posix සඳහා පෙරනිමි අගයන් සම්පාදනයේදී --enable-xpg-echo-defaultසහ ස්ක්රිප්ටයේ --enable-strict-posix-defaultවිකල්ප සමඟ අර්ථ දැක්විය හැකිය configure. OS / X හි මෑත සංස්කරණ ඒවා සෑදීම සඳහා සාමාන්යයෙන් කරන්නේ එයයි /bin/sh. ඔවුන්ගේ දකුණු මතක නැත Unix / Linux ක්රියාත්මක කිරීම / බෙදා හැරීමේ සාමාන්යයෙන් වෙනුවෙන් කරන්න කැමතිද /bin/bashනමුත් . ඇත්ත වශයෙන්ම, එය සත්යයක් නොවේ, /bin/bashසොලාරිස් 11 සමඟ ඔරකල් නැව් (විකල්ප පැකේජයක) ඉදිකර ඇති බව පෙනේ --enable-xpg-echo-default(සොලාරිස් 10 හි එය එසේ නොවේ).
2. ksh93'' ගේ echoහැසිරීම වෙනස් කළ හැක.
තුළ ksh93, echoගැලවීමේ අනුපිළිවෙල පුළුල් කරනවාද නැද්ද යන්න සහ විකල්ප හඳුනා ගන්නේද යන්න රඳා පවතින්නේ $PATHසහ / හෝ $_AST_FEATURESපරිසර විචල්යයන්ගේ අන්තර්ගතය මතය .
නම් $PATHඅඩංගු වන බව අංගයක් අඩංගු /5binහෝ /xpgපෙර /binහෝ /usr/binඅංගයක් එය තිබෙන්නේ SysV / යුනික්ස් මාර්ගය හැසිරෙන (පුළුල් වන අනුපිළිවෙලවල්, විකල්ප පිළිගන්නේ නැහැ). එය සොයාගතහොත් /ucbහෝ /bsdපළමුව හෝ $_AST_FEATURES7 අඩංගු UNIVERSE = ucbනම්, එය BSD 3 ආකාරයෙන් ක්රියා කරයි ( -eපුළුල් කිරීම සක්රීය කිරීම සඳහා, හඳුනා ගනී -n).
පෙරනිමිය පද්ධතිය මත රඳා පවතී, ඩේබියන් මත BSD ( builtin getconf; getconf UNIVERSEksh93 හි මෑත සංස්කරණවල ප්රතිදානය බලන්න ):
$ ksh93 -c 'echo -n' # default -> BSD (on Debian)
$ PATH=/foo/xpgbar:$PATH ksh93 -c 'echo -n' # /xpg before /bin or /usr/bin -> XPG
-n
$ PATH=/5binary:$PATH ksh93 -c 'echo -n' # /5bin before /bin or /usr/bin -> XPG
-n
$ PATH=/5binary:$PATH _AST_FEATURES='UNIVERSE = ucb' ksh93 -c 'echo -n' # -> BSD
$ PATH=/ucb:/foo/xpgbar:$PATH ksh93 -c 'echo -n' # /ucb first -> BSD
$ PATH=/bin:/foo/xpgbar:$PATH ksh93 -c 'echo -n' # /bin before /xpg -> default -> BSD
3. echo -e සඳහා BSD?
-eවිකල්පය හැසිරවීම සඳහා BSD වෙත යොමු කිරීම මෙහි ටිකක් නොමඟ යවන සුළුය. වෙනස් හා නොගැලපෙන echoහැසිරීම් බොහොමයක් AT&T හි හඳුන්වා දී ඇත:
\n, \0ooo, \cProgrammer ගේ වැඩ විනිසුරු මඬුල්ල යුනික්ස් (Unix V6 මත පදනම් වූ), සහ ඉතිරි ( \b, \r...), Unix පද්ධතියේ III වන අංකය .
-nයුනික්ස් V7 (ඩෙනිස් රිචී විසින් අංකය )
-eයුනික්ස් වී 8 හි (ඩෙනිස් රිචී රීෆ් විසින් )
-Eතමන් හැකි මුලින් පැමිණි bash(දී CWRU / CWRU.chlog 1.13.5 අනුවාදය GNU, බ්රයන් ෆොක්ස් 1992-10-18 එය එකතු සඳහන් echoකෙටි කලකට sh-utils-1.8 දින 10 පසුව නිදහස් පසු එය පිටපත්)
කරන අතර echoම builtin shBSDs ක ඇති සහයෝගය -eඔවුන් මුල් 90 ගණන්වල දී එය සඳහා Almquist ෂෙල් භාවිත කිරීම ආරම්භ කළ දින පටන් මෙම නවීන echoමේ දවස දක්වා උපයෝගිතා එය සඳහා පහසුකම් සපයන්නේ නැත එහි ( ඒ අතරින් කිහිපයකිecho තවමත් සහාය නොදක්වයි -eඑය සහාය කරන්නේ නමුත් -nවගේ යුනික්ස් වී 7 (එසේම \cඅවසාන තර්කයේ අවසානයේ පමණක්)).
සම්බන්ධ කටයුතු -eකිරීමට සිදු විය ksh93ගේ echoමෙම BSD දී විට විශ්වය ඇති ksh93r අනුවාදය 2006 දී නිදහස් හා ෙ අවස්ථාවේ දී අක්රීය කළ හැක ය.
4. 8.31 හි GNU ප්රතිරාවය හැසිරීම වෙනස් කිරීම
Coreutils 8.31 (සහ පසුව මෙම සිදු ), GNU echoදැන් පලා අනුක්රමය පෙරනිමියෙන්, හැසිරීම ගැලපෙන පුළුල් POSIXLY_CORRECT පරිසරය තුළ විට bash -o posix -O xpg_echoගේ echobuiltin (බලන්න දෝෂ වාර්තාවක් ).
5. මැකෝස් echo
මැකෝස් හි බොහෝ අනුවාදයන්ට යුනික්ස් සහතිකය OpenGroup වෙතින් ලැබී ඇත.
පෙරනිමියෙන් සක්රිය කර ඇති පරිදි (ඉතා පැරණි අනුවාදයක්) ඔවුන්ගේ shබිල්ඩින් echoඅනුකූල වේ , නමුත් ඒවායේ තනිවම උපයෝගීතාව නැත. පහත ප්රතිඵල කිසිවක් වෙනුවට , පහත ප්රතිඵල වෙනුවට .bashxpg_echoechoenv echo -n-n<newline>env echo '\n'\n<newline><newline><newline>
ඒ /bin/echoපළමු තර්කය නම් නව පේළියකට යොමු කිරීමේ අක්ෂරය ප්රතිදානය මර්දනය කරන ඒ අතරින් කිහිපයකි සිට එක් -n(1995 වසරේ සිට) හෝ පසුගිය තර්කය අවසන් නම් \c, නමුත් පවා, යුනික්ස් අවශ්ය වෙනත් ඕනෑම පදයේ අග අනුක්රමය සඳහා පහසුකම් සපයන්නේ නැත \\.
6. echoඅත්තනෝමතික දත්ත වාචික ප්රතිදානය කළ හැකි ක්රියාත්මක කිරීම්
නියමාකාරයෙන්, ඔබ ද ඒ අතරින් කිහිපයකි / macOS බව ගණන් කළ නොහැකි /bin/echo(නොවේ ඔවුන්ගේ shell ගේ ඉහත echobuiltin) එහිදී zshගේ echo -E - "$var"හෝ yashගේ ECHO_STYLE=raw echo "$var"( printf '%s\n' "$var"ක්) ලියා ගත හැකි:
/bin/echo "$var
\c"
හා zshගේ echo -nE - "$var"( printf %s "$var"ක්) ලියා ගත හැකි
/bin/echo "$var\c"
සහාය දක්වන -Eසහ -n(හෝ වින්යාසගත කළ හැකි) ක්රියාත්මක කිරීම් ද කළ හැකිය:
echo -nE "$var
"
සමාන printf '%s\n' "$var".
7. _AST_FEATURESසහ ඒඑස්ටීUNIVERSE
මෙම _AST_FEATURESසෘජුවම කළ යුතු වැදගත් කරුණක් අදහස් නොවේ, එය විධාන ක්රියාත්මක හරහා AST වින්යාසයන් ප්රචාරය කිරීමට භාවිතා කරයි. වින්යාසය (ලේඛනගත නොකළ) astgetconf()API හරහා සිදු කිරීමට අදහස් කෙරේ . ඇතුළත ksh93, getconfබිල්ඩින් ( builtin getconfආයාචනය කිරීමෙන් හෝ සක්රීය කිරීමෙන් command /opt/ast/bin/getconf) යනු අතුරු මුහුණතයිastgetconf()
උදාහරණයක් වශයෙන්, ඔබ කැමතියි builtin getconf; getconf UNIVERSE = att, වෙනස් UNIVERSEකිරීමට සැකසුම att(ඇති echoඅනෙකුත් දේවල් අතර තිබෙන්නේ SysV මාර්ගය හැසිරීමට). එය කිරීමෙන් පසු, $_AST_FEATURESපරිසර විචල්යය අඩංගු බව ඔබට පෙනෙනු UNIVERSE = attඇත.