මූලික වශයෙන්, එය අතේ ගෙන යා හැකි (සහ විශ්වසනීයත්වය) ගැටළුවකි.
මුලදී, 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
වැනි (යුනික්ස් නොවන) සමහර ක්රියාත්මක කිරීම් සමඟ හොඳින් ක්රියා කරයි).bash
xpg_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
විකල්පය යන්න bash
POSIX මාදිලිය වේ. 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_FEATURES
7 අඩංගු UNIVERSE = ucb
නම්, එය BSD 3 ආකාරයෙන් ක්රියා කරයි ( -e
පුළුල් කිරීම සක්රීය කිරීම සඳහා, හඳුනා ගනී -n
).
පෙරනිමිය පද්ධතිය මත රඳා පවතී, ඩේබියන් මත BSD ( builtin getconf; getconf UNIVERSE
ksh93 හි මෑත සංස්කරණවල ප්රතිදානය බලන්න ):
$ 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
, \c
Programmer ගේ වැඩ විනිසුරු මඬුල්ල යුනික්ස් (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 sh
BSDs ක ඇති සහයෝගය -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
ගේ echo
builtin (බලන්න දෝෂ වාර්තාවක් ).
5. මැකෝස් echo
මැකෝස් හි බොහෝ අනුවාදයන්ට යුනික්ස් සහතිකය OpenGroup වෙතින් ලැබී ඇත.
පෙරනිමියෙන් සක්රිය කර ඇති පරිදි (ඉතා පැරණි අනුවාදයක්) ඔවුන්ගේ sh
බිල්ඩින් echo
අනුකූල වේ , නමුත් ඒවායේ තනිවම උපයෝගීතාව නැත. පහත ප්රතිඵල කිසිවක් වෙනුවට , පහත ප්රතිඵල වෙනුවට .bash
xpg_echo
echo
env echo -n
-n<newline>
env echo '\n'
\n<newline>
<newline><newline>
ඒ /bin/echo
පළමු තර්කය නම් නව පේළියකට යොමු කිරීමේ අක්ෂරය ප්රතිදානය මර්දනය කරන ඒ අතරින් කිහිපයකි සිට එක් -n
(1995 වසරේ සිට) හෝ පසුගිය තර්කය අවසන් නම් \c
, නමුත් පවා, යුනික්ස් අවශ්ය වෙනත් ඕනෑම පදයේ අග අනුක්රමය සඳහා පහසුකම් සපයන්නේ නැත \\
.
6. echo
අත්තනෝමතික දත්ත වාචික ප්රතිදානය කළ හැකි ක්රියාත්මක කිරීම්
නියමාකාරයෙන්, ඔබ ද ඒ අතරින් කිහිපයකි / macOS බව ගණන් කළ නොහැකි /bin/echo
(නොවේ ඔවුන්ගේ shell ගේ ඉහත echo
builtin) එහිදී 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
ඇත.