Printf දෝංකාරයට වඩා හොඳ ඇයි?


565

මම අහලා තියෙනවා printfඊට වඩා හොඳයි කියලා echo. මම භාවිතා කිරීම එහිදී මගේ අත්දැකීම් සිට එකම එක උදාහරණයක් මතකයි printfනිසා echoRHEL 5.8 මත යම් වැඩසටහනක් බවට අකුරු පෝෂණය වෙනුවෙන් වැඩ නමුත් කළේ නැහැ printfකළා. නමුත් පෙනෙන ආකාරයට, වෙනත් වෙනස්කම් ඇති අතර, ඒවා මොනවාදැයි විමසීමට මම කැමැත්තෙමි.

Answers:


789

මූලික වශයෙන්, එය අතේ ගෙන යා හැකි (සහ විශ්වසනීයත්වය) ගැටළුවකි.

මුලදී, 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ඇත.


14
මුල් යුනික්ස් සංවර්ධනය බොහෝමයක් හුදකලාව සිදු වූ අතර, 'ඔබ අතුරු මුහුණත වෙනස් කරන විට, නම වෙනස් කරන්න' වැනි හොඳ මෘදුකාංග ඉංජිනේරු මූලධර්ම අදාළ නොවීය.
හෙන්ක් ලැන්ග්වෙල්ඩ්

7
සටහනක් ලෙස, උපුටා දැක්වීමේ වාක්‍ය ඛණ්ඩයේ කොටසක් ලෙස කවචයට ප්‍රතිවිරුද්ධ අනුපිළිවෙල echoපුළුල් කිරීමේ එක් (සහ සමහර විට) වාසිය \xනම් ඔබට පසුව NUL බයිට් එකක් ප්‍රතිදානය කළ හැකිය (යුනික්ස් හි තවත් වැරදි ලෙස සැලසුම් කිරීම යනු ශුන්‍ය ලෙස වෙන් කරන ලද ඒවා ය පද්ධති ඇමතුම් වලින් අඩකට (වැනි execve()) අත්තනෝමතික බයිට් අනුපිළිවෙලක් ගත නොහැකි නූල් )
ස්ටෙෆාන් චසෙලාස්

28

ඔබට printfඑහි ආකෘතිකරණ විකල්ප සඳහා භාවිතා කිරීමට අවශ්‍ය විය හැකිය . echoවිචල්‍යයක හෝ (සරල) රේඛාවක අගය මුද්‍රණය කිරීමේදී එය ප්‍රයෝජනවත් වේ, නමුත් එපමණයි. printfඑහි C අනුවාදයට කළ හැකි දේ මූලික වශයෙන් කළ හැකිය.

උදාහරණ භාවිතය සහ හැකියාවන්:

Echo:

echo "*** Backup shell script ***"
echo
echo "Runtime: $(date) @ $(hostname)"
echo

printf:

vech="bike"
printf "%s\n" "$vech"

මුලාශ්‍ර:


9
echoවිචල්යයේ අගයෙහි මෙටා-අක්ෂර අඩංගු නම් විචල්යයක් මුද්රණය කිරීම භාවිතා කිරීම අසමත් විය හැකිය.
කීත් තොම්සන්

17

එක් "වාසියක්", ඔබට එය හැඳින්වීමට අවශ්‍ය නම්, echoසමහර ගැලවීමේ අනුපිළිවෙල අර්ථ නිරූපණය කිරීමට ඔබට එය පැවසිය යුතු නැත \n. ඒවා අර්ථ නිරූපණය කිරීමට දන්නා අතර එසේ කිරීමට අවශ්‍ය නොවනු ඇත -e.

printf "some\nmulti-lined\ntext\n"

(සැ.යු: අන්තිමයා \nඅවශ්‍යයි, echoඑයින් ඇඟවෙන්නේ ඔබ -nවිකල්පය ලබා නොදුනහොත්)

එදිරිව

echo -e "some\nmulti-lined\ntext"

පසුගිය සටහන \nදී printf. දවස අවසානයේදී එය ඔබ භාවිතා කරන දේවල රසය හා අවශ්‍යතා පිළිබඳ කාරණයකි : echoහෝ printf.


2
ඇත්ත /usr/bin/echoසහ bashගොඩනඟන ලද. මෙම dash, kshහා zshbuiltin echoඅවශ්ය නැත -eපසු ඇල ඉර-පලා චරිත පුළුල් කිරීමට ස්විචය.
manatwork

බිය උපදවන උපුටා දැක්වීම් කරන්නේ ඇයි? ඔබේ වචන වලින් ගම්‍ය වන්නේ එය සැබෑ වාසියක් නොවන බවයි.
කීත් තොම්සන්

3
E කීත් තොම්සන්: ඇත්ත වශයෙන්ම ඔවුන් අදහස් කරන්නේ සියල්ලන්ටම එය වාසියක් ලෙස නොසැලකීමයි .
0xC0000022L

ඔබට එය පුළුල් කළ හැකිද? එය වාසියක් නොවන්නේ ඇයි? "ඔබට එය ඇමතීමට අවශ්‍ය නම්" යන වාක්‍ය ඛණ්ඩය එයින් අදහස් කරන්නේ එය එසේ නොවන බවයි.
කීත් තොම්සන්

3
නැත්නම් ඔයාට කරන්න පුළුවන් printf '%s\n' 'foo\bar.
nyuszika7h

5

එහි එක් අවාසියක් printfනම් කාර්ය සාධනයයි, මන්දයත් ගොඩනඟන ලද කවචය echoවඩා වේගවත් බැවිනි. මෙය විශේෂයෙන් සිග්වින් හි ක්‍රියාත්මක වන අතර එහිදී නව විධානයක සෑම අවස්ථාවක්ම අධික වින්ඩෝස් උඩු යටිකුරු කරයි. මගේ ප්‍රතිරාවය-බර වැඩසටහන /bin/echoෂෙල් එකේ දෝංකාරය දක්වා වෙනස් කළ විට කාර්ය සාධනය දෙගුණයක් විය. එය අතේ ගෙන යා හැකි හැකියාව සහ ක්‍රියාකාරීත්වය අතර හුවමාරුවකි. සෑම විටම භාවිතා කිරීම ස්ලෑම් ඩන්ක් නොවේ printf.


18
printfවර්තමානයේ බොහෝ ෂෙල් වෙඩි වලින් සාදා ඇත (bash, dash, ksh, zsh, yash, සමහර pdksh ව්‍යුත්පන්නයන් ... එබැවින් සිග්වින් වලද දක්නට ලැබෙන ෂෙල් වෙඩි ඇතුළත් වේ). එකම කැපී පෙනෙන ව්‍යතිරේකය වන්නේ සමහර pdkshව්‍යුත්පන්නයන් ය.
ස්ටෙෆාන් චසෙලාස්

නමුත් එම printf ක්‍රියාත්මක කිරීම් බොහොමයක් කැඩී ඇත. ඔබ printfනූල් බයිට් ප්‍රතිදානය කිරීමට භාවිතා කිරීමට කැමති විට මෙය අත්‍යවශ්‍ය වේ, නමුත් සමහර ක්‍රියාත්මක කිරීම් '\ c' ආකෘති පත්‍රයේ අර්ථ නිරූපණය කළ යුතු නොවේ.
schily

3
chschily, printfඔබ \cආකෘතියේ නූල් භාවිතා කරන්නේ නම් POSIX විසින් හැසිරීම නිශ්චිතව දක්වා නැත , එබැවින් printfක්‍රියාත්මක කිරීම මඟින් ඔවුන්ට අවශ්‍ය ඕනෑම දෙයක් කළ හැකිය. නිදසුනක් ලෙස, සමහරු එය PWB හි ඇති ආකාරයටම සලකති echo(printf පිටවීමට හේතු වේ), ksh එය \cAපාලක අක්ෂර සඳහා භාවිතා කරයි (printf හැඩතල පරාමිතිය සඳහා වන $'...'නමුත් එසේ echoනොවේ print!). වගබලා බව මුද්රණය NUL ඇති කළ යුතු දේ බයිට්, හෝ සමහර විට ඔයා තමයි අනවසරකරුවන්ගේ kshගේ printf '\c@'?
ස්ටෙෆාන් චසෙලාස්
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.