рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЬреАрдПрдирдпреВ рдХреЛрд░реБрдЯрд┐рд▓реНрд╕ рд╕реНрд░реЛрдд рдХреЛрдб: рд╣рд╛рдБ рдЙрдкрдпреЛрдЧрд┐рддрд╛

(рд▓реЗрдЦ рдСрдлрд╝рд▓рд╛рдЗрди рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ: рдорд╛рд░реНрдХрдбрд╛рдЙрди | рдкреАрдбреАрдПрдл | рдкреАрдбреАрдПрдл (рдкреНрд░рд┐рдВрдЯ) | рдПрдЪрдЯреАрдПрдордПрд▓ )

рдХреНрдпреЛрдВ?


рд╣рдорд╛рд░реЗ рдЖрд╕рдкрд╛рд╕ рд╣рд░ рдХреЛрдИ рд▓рдЧрд╛рддрд╛рд░ рдХрд╣рддрд╛ рд╣реИ: тАЬрдХреНрдпрд╛ рдЖрдк рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрд╢реЗрд╡рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ? рджреЗрдЦреЗрдВ рдХрд┐ рджреВрд╕рд░реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ! тАЭ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдореЗрд░реЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХреЗ рдЕрдзреНрдпрдпрди рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рдФрд░ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдпрд╛ ред рдЬреАрдПрдирдпреВ рдХреЛрд░реБрдЯрд┐рд▓реНрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИ:
  1. рдХрдард┐рди рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВред
  2. рдмрдбрд╝рд╛ рдЬреАрд╡рди рдЪрдХреНрд░ред
  3. рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЯреАрдоред
  4. рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдХреЛрдб: рддреБрдЪреНрдЫ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рд╕реЗ рд╕реБрдкрд░-рдкрд░рд┐рд╖реНрдХреГрдд рд╕реЗрдб рддрдХ, рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ wc рд╕реЗ mkdir OS рдХреЗ рдХрд░реАрдмред

GNU Coreutils


GNU Core Utilites рдореВрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ: рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдирд╛, рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ: рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрд╡рд┐рди рд╣реИ, рд▓реЗрдХрд┐рди * рдирд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред POSIX рдорд╛рдирдХ, рдЬреЛ Coreutils рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХреА рдПрдХрд░реВрдкрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред Coreutils рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдЬреИрд╕реЗ рдмрд┐рд▓реНрд▓реА, рдкреВрдВрдЫ, рдЧреВрдВрдЬ, wc рдФрд░ рдХрдИ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓реЛ рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪреБрдиреЗрдВ рдЬрд┐рд╕реЗ рд╣рд╛рдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреА рд╕рд░рд▓рддрд╛ рдЖрдкрдХреЛ рдХреЛрд░реБрдЯрд┐рд▓реНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреВрд▓ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреАред

рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣рд╛рдБ


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдирд╛ рдХрд╣рддреА рд╣реИ, рд╣рд╛рдВ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЬреЛ рдХрд░ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ "yn" рдХреЛ stdout рдХрд░рдирд╛ред рдпрджрд┐ рд╣рдо рд╣рд╛рдБ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "y" рдХреЗ рдмрдЬрд╛рдп, рд╣рд╛рдБ рдПрдХ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВрдЧреЗред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣рд░ рдХрд┐рд╕реА рдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕реАред рдХрд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ рдХрд┐ рдЬреАрдПрдирдпреВ рд╕реЗ рдЧрдВрднреАрд░ рджрд╛рдврд╝реА рд╡рд╛рд▓реЗ рдЪрд╛рдЪрд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд╛рдБ, рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ ред

рд╕реНрд░реЛрдд рдХреЛрдб


рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдпрд╛ рддреЛ apt-get source рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗрдВрдЧреЗ: рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкрд░рд┐рдЪрд┐рдд рд╣реИред
  1. рдХреЛрд░реБрдЯрд┐рд▓реНрд╕: git clone git://git.sv.gnu.org/coreutils
  2. Gnulib (рдХрдИ рдмрд╛рд░ рджреЗрдЦреЗрдВ): git clone git://git.savannah.gnu.org/gnulib.git

рд╕реНрд░реЛрдд рдХреЛрдб рд╣рд╛рдБ рдПрдХ coreutils/src/yes.c рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЦреЛрд▓реЗрдВред

рдХреЛрдбрд┐рдВрдЧ рд╢реИрд▓реА


рдкрд╣рд▓реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдЖрдк рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ рдХреЛрдб рдХрд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕реНрд╡рд░реВрдкрдгред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд GNU рдХреЛрдбрд┐рдВрдЧ рдорд╛рдирдХ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╡рд╛рдкрд╕реА рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдУрдкрдирд┐рдВрдЧ рдмреНрд░реИрдХреЗрдЯ:

 int main (int argc, char **argv) { foo(); ... } 

рдХреЗрд╡рд▓ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдФрд░ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдХреЗ рдмреАрдЪ, рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдореЗрдВ рдЕрдВрддрд░ 2 рд╕реНрдерд╛рди рд╣реИред рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдХреГрдд рд░реВрдк рд╣реЛрддрд╛ рд╣реИ:

 if (x < foo (y, z)) haha = bar[4] + 5; else { while (z) { haha += foo (z, z); z--; } return ++x + bar (); } 

12 рд▓рд╛рдЗрдиреЗрдВ


yes.c рд╕рднреА GPL рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдореЗрд░реА рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реНрдердирд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдФрд░ рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд░рд╣рд╕реНрдп рдереАред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдкрд╛рда GPL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдХреЛрдИ рднреА рдЬреАрдкреАрдПрд▓ рдХреЗ рддрд╣рдд рдЕрдкрдиреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рдЬрд╛рд░реА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЙрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХреЙрдкреА-рд░рд╛рдЗрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдЗрди 12 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

initialize_main


рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреА рд╣реИ, рд╡рд╣ рд╣реИ initialize_main ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддрд░реНрдХреЛрдВ рдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, Coreutils рдореЗрдВ рдПрдХ рднреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧреАред рд╣рд░ рдЬрдЧрд╣ рд╕реНрдЯрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, coreutils/src/system.h рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 #ifndef initialize_main # define initialize_main(ac, av) #endif 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд╛рдо


Coreutils рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ рджреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╛рдореЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИрдВ:
  1. рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд╛рдо рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  2. рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╛рдоред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 user@laptop:~$ yes --version yes (GNU coreutils) 8.5 Usage: yes [STRING]... or: yes OPTION 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдирд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

 user@laptop:~$ /usr/bin/yes --version yes (GNU coreutils) 8.5 user@laptop:~$ cp /usr/bin/yes ./foo user@laptop:~$ ./foo --version yes (GNU coreutils) 8.5 

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ PROGRAM_NAME рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 /* The official name of this program (eg, no `g' prefix). */ #define PROGRAM_NAME "yes" 

рдЕрд╕рд▓реА рдирд╛рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд╛рд▓ рдХреЗ argv[0] рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 user@laptop:~$ yes --help Usage: yes [STRING]... or: yes OPTION user@laptop:~$ /usr/bin/yes --help Usage: /usr/bin/yes [STRING]... or: /usr/bin/yes OPTION 

argv[0] рдХрд╛ рдорд╛рди main рдХреА рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ set_program_name рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ program_name рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:

 set_program_name (argv[0]); 

set_program_name рдлрд╝рдВрдХреНрд╢рди Gnulib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб gnulib/lib/ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, progname.h рдФрд░ progname.c ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ set_program_name рди рдХреЗрд╡рд▓ argv[0] рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ progname.h рдореЗрдВ рдШреЛрд╖рд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ program_name рдореЗрдВ program_name , рдмрд▓реНрдХрд┐ program_name рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдкрд╛рдВрддрд░рдг рднреА рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред

рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг


Coreutils рдХрд╛ рдЙрдкрдпреЛрдЧ рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ GNU рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдкреИрдХреЗрдЬ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреИрдХреЗрдЬ GNU рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдлреИрд▓рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ Django рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЧреЗрдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдЪреМрдЦрдЯреЗ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдмрд░ рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИред

рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдХреА рдорд╣рд╛рди рд╕рдВрдкрддреНрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реА рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рдПрдХ рдорд╛рдирдХ рдЬрд╛рджреВ рдлрд╝рдВрдХреНрд╢рди _ , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ usage рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 void usage (int status) { if (status != EXIT_SUCCESS) fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name); ... } 

_ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░рд┐рдЪрд┐рдд system.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ:

 #define _(msgid) gettext (msgid) 

рдХреЛрд░реБрдЯрд┐рд▓реНрд╕ рдореЗрдВ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рддрдВрддреНрд░ рдХрд╛ рдЖрд░рдВрдн main рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); 


рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


main рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:

 atexit (close_stdout); 

рд╕рд╣рдЬ рд░реВрдк рд╕реЗ, рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ close_stdout рдлрд╝рдВрдХреНрд╢рди рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдХреБрдЫ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдгрдХ рдХреЗ рд╕рд╛рде stdout рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрдлрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рддреА рд╣реИред

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ


рдпрд╣ рдЖрдЦрд┐рд░реА рд╕рд╡рд╛рд▓ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рдо рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рдордп-рдкрд░реАрдХреНрд╖рдгрд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХреНрд░реЙрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдореЗрдВ ) - рдЧреЗрдЯрдЯреЙрдк рдореЙрдбреНрдпреВрд▓ред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд▓реВрдк рдореЗрдВ getopt рдпрд╛ getopt_long рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдк рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ getopt рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдм рдкрд░ рднреА рд▓рд┐рдЦрд╛ рд╣реИред

Gnulib рдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рд╣реИ, parse_long_options рдЧрдпрд╛ рд╣реИ, рдЬреЛ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП --version рдФрд░ --help , рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА GNU рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдпрд╣ gnulib/lib/long-options.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ gnulib/lib/long-options.c рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдБ рд╕реНрд░реЛрдд рдХреЛрдб рдПрдХ рд╢рд╛рдВрдд getopt рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕реА рд╕рдордп, рджрд░реНрдЬрдиреЛрдВ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рднреА рдЧреЗрдЯрдЕрдк рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, parse_long_options рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ parse_long_options ред рдлрд┐рд░ рдпрд╣ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХреЛрдИ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдХрд▓реНрдк рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╢реЗрд╖ рддрд░реНрдХ, рдпрджрд┐ рдХреЛрдИ рд╣реИрдВ, рддреЛ рдмрд╕ рдордирдорд╛рдирд╛ рддрд╛рд░ рд╣реИрдВ:

 parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version, usage, AUTHORS, (char const *) NULL); if (getopt_long (argc, argv, "+", NULL, NULL) != -1) usage (EXIT_FAILURE); 

рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: "рдЕрдЧрд░ --version рдФрд░ --help рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рддрд░реНрдХреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдерд╛, рддреЛ рд╣рдо" y "рдХреЛ stdout рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗ":

 if (argc <= optind) { optind = argc; argv[argc++] = bad_cast ("y"); } 

argv[argc] рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ: ANSI C рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ argv[argc] рддрддреНрд╡ рдПрдХ рд╢реВрдиреНрдп рд╕реВрдЪрдХ рд╣реЛред

рдореБрдЦреНрдп рдЪрдХреНрд░


рдареАрдХ рд╣реИ, рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдмрд╣реБрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ:

 while (true) { int i; for (i = optind; i < argc; i++) if (fputs (argv[i], stdout) == EOF || putchar (i == argc - 1 ? '\n' : ' ') == EOF) error (EXIT_FAILURE, errno, _("standard output")); } 

рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдПрдВ if рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрджрд░ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдХреЗрд░реНрдирд┐рдЧрди рдФрд░ рд░рд┐рдЪреА рдиреЗ рдЭреВрда рдирд╣реАрдВ рдмреЛрд▓рд╛ рдЬрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рд┐рдЦрд╛ рдХрд┐ рдПрдХ рдЕрдиреБрднрд╡реА рд╕реА-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдирдХрд▓ рд▓рд╛рдЗрдиреЛрдВ рдХреА рддрд░рд╣ рд╣реИ:

 while (*dst++ = *src++) ; 

Source: https://habr.com/ru/post/In133408/


All Articles