Difference between revisions of "Command line parameters and environment variables/ru"

From Free Pascal wiki
Jump to navigationJump to search
(Category Code->Code/ru)
 
(12 intermediate revisions by one other user not shown)
Line 5: Line 5:
 
== Обзор ==
 
== Обзор ==
  
Although this page speaks of ''command-line'' parameters and environment variables, an actual command line interface (CLI) is not a requirement to use such data, nor to use the routines and terminology described here.
+
Хотя на этой странице говорится о ''параметрах командной строки'' и переменных среды, фактический интерфейс командной строки (CLI) не является обязательным требованием для использования таких данных, а также для использования процедур и терминологии, описанных здесь.
However, since a CLI is more tangible the following instructions mainly to refer to a shell’s user experience.
+
Однако, поскольку интерфейс командной строки более осязаем, следующие инструкции в основном относятся к пользовательскому интерфейсу оболочки.
  
=== Terminology ===
+
=== Терминология ===
  
; Option
+
; Option (переключатели)
: Options are yes/no flags. They usually assume the form <syntaxhighlight lang="bash" inline>‑‑dryrun</syntaxhighlight>/<syntaxhighlight lang="bash" inline>‑‑no‑dryrun</syntaxhighlight> (dryrun enabled or disabled respectively). Options are also called “switches”.
+
: Опции - флаги yes/no. Обычно они имеют вид <syntaxhighlight lang="bash" inline>‑‑dryrun</syntaxhighlight>/<syntaxhighlight lang="bash" inline>‑‑no‑dryrun</syntaxhighlight> (dryrun включен или отключен соответственно). Опции также называются «переключателями».
; Parameter
+
; Parameter (параметр)
: Parameters are key-value-tuples. On the command line they look like: <syntaxhighlight lang="bash" inline>‑‑processors 4</syntaxhighlight>.
+
: Параметры представляют собой кортежи ключ-значение. В командной строке они выглядят так: <syntaxhighlight lang="bash" inline>‑‑processors 4</syntaxhighlight>.
; Argument
+
; Argument (аргумент)
: Arguments are simple words. On the command line they are usually separated by spaces (confer the <abbr title="internal field separator">IFS</abbr> variable in some shells). In a narrow sense ''arguments'' are all supplied words that are neither options or (part of) parameters. In general, though, arguments are all words on the command line not being interpreted in any way.
+
: Аргументы — это простые слова. В командной строке они обычно разделяются пробелами (назначают переменную [https://en.wikipedia.org/wiki/Input_Field_Separators IFS] в некоторых оболочках). В узком смысле, аргументы — это все предоставленные слова, которые не являются ни опциями, ни (частью) параметров. В общем, ''аргументы'' — это все слова в командной строке, которые никак не интерпретируются.
; Environment variable
+
; Environment variable (переменные окружения)
: Environment variables refer to a labeled piece of storage in the environment. They are name-value-pairs. <!-- source: https://en.wikibooks.org/w/index.php?title=Bourne_Shell_Scripting/Environment&oldid=3677309#The_environment_and_environment_variables -->
+
: Переменные окружения относятся к помеченной части хранилища в среде. Это пары имя-значение. <!-- source: https://en.wikibooks.org/w/index.php?title=Bourne_Shell_Scripting/Environment&oldid=3677309#The_environment_and_environment_variables -->
  
Note, the CLI/OS provides the program only with arguments it is supposed to get:
+
Обратите внимание, CLI/OS предоставляет программе только те аргументы, которые она должна получить:
For example, escaped newline characters, file redirection (pipes or to a file), and assignment of environment variables will not be forwarded to the program.
+
например, экранированные символы новой строки, перенаправление файла (каналы или в файл) и присвоение переменных среды не будут перенаправлены в программу.
  
=== Basics ===
+
=== Основы ===
  
Since the notion of “option” and “parameters” are already kind of high-level, different styles exist (short options vs. long options), and the system unit aims to provide the ''basic'' means to work with, all command line arguments are simply enumerated starting from zero.
+
Поскольку понятия «опция» и «параметры» уже являются своего рода высокоуровневыми, существуют разные стили (короткие опции против длинных опций), и модуль system стремится предоставить ''базовые'' средства для работы, все аргументы командной строки просто перечисляютсяить, начиная с нуля. Никакой интерпретации не делается.
No interpretation is done.
 
  
The function {{Doc|package=RTL|unit=system|identifier=paramstr|text=<syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight>}} returns the n-th argument on the command line.
+
Функция {{Doc|package=RTL|unit=system|identifier=paramstr|text=<syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight>}} возвращает n-й аргумент в командной строке. <syntaxhighlight lang="pascal" inline>ParamStr(0)</syntaxhighlight> пытается вернуть имя и, возможно, полный путь к исполняемому программному файлу.
<syntaxhighlight lang="pascal" inline>ParamStr(0)</syntaxhighlight> tries returning the name, and possibly full path to the executable program file.
 
  
== Command line parameters ==
+
== Параметры командной строки ==
  
=== The basics ===
+
=== Основы ===
  
A Pascal program can a access command line arguments by using the <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> [[Function|function]] in conjunction with {{Doc|package=RTL|unit=system|identifier=paramcount|text=<syntaxhighlight lang="pascal" inline>paramCount</syntaxhighlight>}}.
+
Программа на Паскале может получить доступ к аргументам командной строки, используя [[Function/ru|функцию]]<syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> в сочетании с {{Doc|package=RTL|unit=system|identifier=paramcount|text=<syntaxhighlight lang="pascal" inline>paramCount</syntaxhighlight>}}. <syntaxhighlight lang="pascal" inline>ParamCount</syntaxhighlight> возвращает количество предоставленных аргументов.
<syntaxhighlight lang="pascal" inline>ParamCount</syntaxhighlight> returns the number of supplied arguments.
 
  
<syntaxhighlight lang="pascal" line>
+
<syntaxhighlight lang="pascal">
 
program listArguments(input, output, stdErr);
 
program listArguments(input, output, stdErr);
 
{$mode objFPC}
 
{$mode objFPC}
Line 44: Line 41:
 
begin
 
begin
 
writeLn({$ifDef Darwin}
 
writeLn({$ifDef Darwin}
// on Mac OS X return value depends on invocation method
+
// в Mac OS X возвращаемое значение зависит от метода вызова
 
'This program was invoked via: ',
 
'This program was invoked via: ',
 
{$else}
 
{$else}
// Turbo Pascal-compliant paramStr(0) returns location
+
// Turbo Pascal-совместимый paramStr(0) возвращает местоположение
 
'This program is/was stored at: ',
 
'This program is/was stored at: ',
 
{$endIf}
 
{$endIf}
Line 59: Line 56:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Running this program (on a non-Mac&nbsp;OS&nbsp;Ⅹ platform) may look like this:
+
Запуск этой программы (на не-Mac&nbsp;OS&nbsp;Ⅹ платформе) может выглядеть следующим образом:
 +
 
 
<syntaxhighlight lang="text">$ ./listArguments foo bar able
 
<syntaxhighlight lang="text">$ ./listArguments foo bar able
 
This program is/was stored at: /tmp/listArguments
 
This program is/was stored at: /tmp/listArguments
Line 67: Line 65:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The [[RTL]]’s system unit provides a <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> version that returns [[Shortstring|<syntaxhighlight lang="pascal" inline>shortString</syntaxhighlight>s]].
+
Модуль [[RTL]] <code>system</code> предоставляет версию <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight>, которая возвращает короткие строки [[Shortstring|<syntaxhighlight lang="pascal" inline>shortString</syntaxhighlight>]]. Из-за особенностей  реализации <syntaxhighlight lang="pascal" inline>shortString</syntaxhighlight> ограничены 255 символами. Однако пользователь может указать более длинные аргументы командной строки.  
Due to their implementation <syntaxhighlight lang="pascal" inline>shortString</syntaxhighlight>s are capped at 255 characters.
+
 
However the user may supply longer command line arguments.
+
Чтобы получить к ним доступ, модуль {{Doc|package=RTL|unit=objpas|text=<syntaxhighlight lang="pascal" inline>objPas</syntaxhighlight>}} переопределяет <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight>, который вместо этого возвращает строки [[Ansistring|<syntaxhighlight lang="pascal" inline>ansiString</syntaxhighlight>]], которые не имеют этого ограничения длины. Модуль <syntaxhighlight lang="pascal" inline>objPas</syntaxhighlight> автоматически включается в режимы компилятора [[Mode ObjFPC|<syntaxhighlight lang="pascal" inline>{$mode objFPC}</syntaxhighlight>]] (строка2) и [[Mode Delphi|<syntaxhighlight lang="pascal" inline>{$mode Delphi}</syntaxhighlight>]].
To access them the {{Doc|package=RTL|unit=objpas|text=<syntaxhighlight lang="pascal" inline>objPas</syntaxhighlight> unit}} redefines <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> that returns [[Ansistring|<syntaxhighlight lang="pascal" inline>ansiString</syntaxhighlight>s]] instead which do not have this length limitation.
 
The <syntaxhighlight lang="pascal" inline>objPas</syntaxhighlight> unit is automatically included in the [[Mode ObjFPC|<syntaxhighlight lang="pascal" inline>{$mode objFPC}</syntaxhighlight>]] (line&nbsp;2) and [[Mode Delphi|<syntaxhighlight lang="pascal" inline>{$mode Delphi}</syntaxhighlight>]] compiler modes.
 
  
The distributed <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> function tries to be [[Turbo Pascal]]-compliant.
+
Распределенная функция <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> пытается быть совместимой с [[Turbo Pascal]]. В TP <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> возвращает местоположение программы. Однако операционная система должна поддерживать это. В частности, в Mac&nbsp;OS&nbsp;Ⅹ значение <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> зависит от метода вызова, от того, как запускается приложение.
In TP <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> returns the location of the program.
 
However, the operating system needs to support that.
 
Most notably, on Mac&nbsp;OS&nbsp;Ⅹ the value of <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> depends on the invocation method, how the application is being started.
 
  
{{Note|Since <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> relies on OS functionality, it is not suitable for [[Multiplatform Programming Guide|cross-platform programs]].}}
+
{{Note|Поскольку <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> зависит от функциональности ОС, он не подходит для [[Multiplatform_Programming_Guide/ru|кроссплатформенных программ]].}}
{{Note|On Unixoid platforms it is impossible to accurately define the location of a file merely by a string.
+
{{Note|На юниксоидных платформах невозможно точно определить местоположение файла только по строке. Может быть несколько жестких ссылок, указывающих на один и тот же индексный дескриптор, файл мог быть уже удален, части пути к файлу могли измениться, помимо других деталей. По этим причинам <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> на юниксоидных платформах бесполезен.}}
There could be multiple hard-links pointing to the same inode, the file could have already been deleted, parts of the file path might have changed, beside other details.
 
For these reasons, <syntaxhighlight lang="pascal" inline>paramStr(0)</syntaxhighlight> is useless on Unixoid platforms.}}
 
  
The {{Doc|package=RTL|unit=getopts|text=<syntaxhighlight lang="pascal" inline>getOpts</syntaxhighlight> unit}} provides a few other routines for program invocation following a certain style.
+
Модуль {{Doc|package=RTL|unit=getopts|text=<syntaxhighlight lang="pascal" inline>getOpts</syntaxhighlight>}} предоставляет несколько других подпрограмм для вызова программы в соответствии с определенным стилем.
  
=== User friendly ===
+
=== Простота использования ===
  
A good program should give a help message when invoked with the wrong parameters and it should follow a common way of giving parameters.
+
Хорошая программа должна выдавать справочное сообщение при вызове с неправильными параметрами и должна следовать общепринятому способу предоставления параметров. Модуль {{Doc|package=FCL|unit=custapp|text=<syntaxhighlight lang="pascal" inline>custApp</syntaxhighlight>}}, поставляемый с FPC, предоставляет класс {{Doc|package=FCL|unit=custapp|identifier=tcustomapplication|text=<syntaxhighlight lang="pascal" inline>TCustomApplication</syntaxhighlight>}}, предоставляющий функции для простой проверки и чтения параметров. Конечно, вы по-прежнему можете получить доступ к параметрам напрямую через <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> и <syntaxhighlight lang="pascal" inline>paramCount</syntaxhighlight>.
The {{Doc|package=FCL|unit=custapp|text=unit <syntaxhighlight lang="pascal" inline>custApp</syntaxhighlight>}} that comes with FPC provides the {{Doc|package=FCL|unit=custapp|identifier=tcustomapplication|text=<syntaxhighlight lang="pascal" inline>TCustomApplication</syntaxhighlight> class}}, which provides functions to easily check and read parameters.
 
Of course you can still access the parameters directly via <syntaxhighlight lang="pascal" inline>paramStr</syntaxhighlight> and <syntaxhighlight lang="pascal" inline>paramCount</syntaxhighlight>.
 
  
Every [[LCL]] application uses this automatically.
+
Каждое приложение [[LCL]] использует это автоматически. Объект Application — это TCustomApplication.
The Application object is a TCustomApplication.
 
  
If you want to write a non LCL program, then create in [[Lazarus]] a new project of type “Console Application”.
+
Если вы хотите написать не LCL-программу, то создайте в [[Lazarus]] новый проект типа «Консольное приложение». Это создаст файл project1.lpr с некоторыми приятными дополнениями, которые нужны почти всем программам. Перейдите к методу <syntaxhighlight lang="pascal" inline>doRun</syntaxhighlight>.
This will create a project1.lpr with some nice goodies, that almost all programs need.
 
Go to the <syntaxhighlight lang="pascal" inline>doRun</syntaxhighlight> method.
 
  
==== Check for a parameter ====
+
==== Проверка параметра ====
  
With TCustomApplication you can access parameters by name.
+
С TCustomApplication вы можете получить доступ к параметрам по имени. Например, ваша программа должна выводить текст справки, когда пользователь задает общий параметр справки ''-h''. ''-h'' является коротким вариантом параметра. Длинная форма ''--help''. Чтобы проверить, вызвал ли пользователь программу с помощью ''-h'' или ''--help'', вы можете использовать следующий код:
For example your program should print a help text when the user gave the common help parameter ''-h''.
 
The ''-h'' is a short option.
 
The long form is the ''--help''.
 
To test whether the user called the program with ''-h'' or ''--help'' you can use:
 
  
 
<syntaxhighlight lang="delphi">
 
<syntaxhighlight lang="delphi">
Line 114: Line 96:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
{{Note|In an LCL form you must prepend <syntaxhighlight lang="delphi" inline>application.</syntaxhighlight> in front of <syntaxhighlight lang="delphi" inline>hasOption</syntaxhighlight>.}}
+
{{Note|В LCL-форме вы должны добавить <syntaxhighlight lang="delphi" inline>application.</syntaxhighlight> перед <syntaxhighlight lang="delphi" inline>hasOption</syntaxhighlight>.}}
For example:
+
 
 +
Например:
  
 
<syntaxhighlight lang="delphi" highlight="1">
 
<syntaxhighlight lang="delphi" highlight="1">
Line 125: Line 108:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
If you only want to support the short option, use:
+
Если вы хотите поддерживать только короткий вариант, используйте:
 
<syntaxhighlight lang="delphi">
 
<syntaxhighlight lang="delphi">
 
if hasOption('h', '') then
 
if hasOption('h', '') then
 
</syntaxhighlight>
 
</syntaxhighlight>
  
If you only want to support the long option, use:
+
Если вы хотите поддерживать только длинный вариант, используйте:
  
 
<syntaxhighlight lang="delphi">
 
<syntaxhighlight lang="delphi">
Line 136: Line 119:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==== Read the parameter value ====
+
==== Чтение значения параметра ====
  
Each parameter can be given a value.
+
Каждому параметру может быть присвоено значение.
For example:
+
Например:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 145: Line 128:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
or in the long form:
+
или в длинной форме:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 151: Line 134:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
In order to retrieve <syntaxhighlight lang="bash" inline>filename</syntaxhighlight> use:
+
Чтобы получить <syntaxhighlight lang="bash" inline>filename</syntaxhighlight>, используйте:
  
 
<syntaxhighlight lang="delphi">
 
<syntaxhighlight lang="delphi">
Line 157: Line 140:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Note: if you get the error message “<syntaxhighlight lang="text" inline>Option at position 1 needs an argument : f.</syntaxhighlight>” then you forgot to add the option in the {{Doc|package=FCL|unit=custapp|identifier=tcustomapplication.checkoptions|text=<syntaxhighlight lang="delphi" inline>checkOptions</syntaxhighlight>}} call.
+
{{Note|если вы получаете сообщение об ошибке "<syntaxhighlight lang="text" inline>Option at position 1 needs an argument : f.</syntaxhighlight>" (Переключатель в позиции 1 нуждается в аргументе: f), то вы забыли добавить опцию при вызове {{Doc|package=FCL|unit=custapp|identifier=tcustomapplication.checkoptions|text=<syntaxhighlight lang="delphi" inline>checkOptions</syntaxhighlight>}}.}}
  
==== Checking parameters for validity ====
+
==== Проверка параметров на валидность ====
  
Command line parameters are free text, so the user can easily type errors.
+
Параметры командной строки представляют собой произвольный текст, поэтому пользователь при вводе может легко допускать ошибки. Отсюда проверка синтаксиса параметров обязательна. Для этого вы можете использовать метод [[doc:fcl/custapp/tcustomapplication.checkoptions.html|CheckOptions]].
Checking the syntax of the parameters is therefore mandatory.
 
You can use the [[doc:fcl/custapp/tcustomapplication.checkoptions.html|CheckOptions]] method for this:
 
  
You can define, what parameters are allowed, which ones ones need a parameter and in case of a syntax error you can get an error message plus the options that were wrong to print helpful and detailed errors.
+
Вы можете определить, какие параметры разрешены, какие из них нуждаются в параметре, а в случае синтаксической ошибки вы можете получить сообщение об ошибке, а также неправильные параметры для печати полезных и подробных ошибок.
  
Examples:
+
Пример:
 
<syntaxhighlight lang="delphi">
 
<syntaxhighlight lang="delphi">
 
errorMsg := checkOptions('hf:', 'help file:');
 
errorMsg := checkOptions('hf:', 'help file:');
 
</syntaxhighlight>
 
</syntaxhighlight>
  
This allows passing short options <syntaxhighlight lang="bash" inline>‑f value</syntaxhighlight> and <syntaxhighlight lang="bash" inline>‑h</syntaxhighlight>.
+
Это позволяет передавать короткие переключатели: <syntaxhighlight lang="bash" inline>‑f value</syntaxhighlight> и <syntaxhighlight lang="bash" inline>‑h</syntaxhighlight>.<br> Это - передавать длинные переключатели: <syntaxhighlight lang="bash" inline>‑‑help</syntaxhighlight> или <syntaxhighlight lang="bash" inline>‑‑file=filename</syntaxhighlight>.<br> А это не позволяет передачу параметра <syntaxhighlight lang="bash" inline>‑‑help</syntaxhighlight> ''со значением'' или <syntaxhighlight lang="bash" inline>‑‑file</syntaxhighlight> ''без значения''.<br>
It allows passing long options <syntaxhighlight lang="bash" inline>‑‑help</syntaxhighlight> or <syntaxhighlight lang="bash" inline>‑‑file=filename</syntaxhighlight>.
 
It does not allow <syntaxhighlight lang="bash" inline>‑‑help</syntaxhighlight> with a value, nor <syntaxhighlight lang="bash" inline>‑‑file</syntaxhighlight> without a value.
 
 
 
A Parameter Example:
 
  
 +
Пример передачи параметра:
 
<syntaxhighlight lang="pascal">procedure TMainForm.FormShow(Sender: TObject);
 
<syntaxhighlight lang="pascal">procedure TMainForm.FormShow(Sender: TObject);
 
var
 
var
Line 195: Line 173:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
This example finds parameters and does not mix them with command line switches or options.
+
Этот пример находит параметры и не смешивает их с переключателями или параметрами командной строки. В этом примере приложение также принимает параметры --debug-sync и --config-dir=somedir, но здесь они не указаны.
In this example, the app also accepts the switches --debug-sync and --config-dir=somedir but they are not reported here.
 
  
Note that Application.GetNonOptions() takes the long options as an array but Application.CheckOptions takes the same data but as a string.
+
Обратите внимание, что Application.GetNonOptions() принимает длинные параметры в виде массива, а Application.CheckOptions принимает те же данные, но в виде строки. Немного грустно!
Bit sad!
 
  
== Environment variables ==
+
== Переменные окружения ==
  
The [[sysutils|<syntaxhighlight lang="pascal" inline>sysUtils</syntaxhighlight> unit]] defines three basic functions in order to retrieve environment variables.
+
Модуль [[sysutils|<syntaxhighlight lang="pascal" inline>sysUtils</syntaxhighlight>]] определяет три основные функции для получения переменных среды.
  
* {{Doc|package=RTL|unit=sysutils|identifier=getenvironmentvariablecount|text=<syntaxhighlight lang="pascal" inline>getEnvironmentVariableCount</syntaxhighlight>}} returns the total number of environment variables
+
* {{Doc|package=RTL|unit=sysutils|identifier=getenvironmentvariablecount|text=<syntaxhighlight lang="pascal" inline>getEnvironmentVariableCount</syntaxhighlight>}} возвращает общее количество переменных среды.
* {{Doc|package=RTL|unit=sysutils|identifier=getenvironmentstring|text=<syntaxhighlight lang="pascal" inline>getEnvironmentString</syntaxhighlight>}} returns an environment variable by its index
+
* {{Doc|package=RTL|unit=sysutils|identifier=getenvironmentstring|text=<syntaxhighlight lang="pascal" inline>getEnvironmentString</syntaxhighlight>}} возвращает переменную среды по ее индексу
* {{Doc|package=RTL|unit=sysutils|identifier=getenvironmentvariable|text=<syntaxhighlight lang="pascal" inline>getEnvironmentVariable</syntaxhighlight>}} returns an environment variable by its key
+
* {{Doc|package=RTL|unit=sysutils|identifier=getenvironmentvariable|text=<syntaxhighlight lang="pascal" inline>getEnvironmentVariable</syntaxhighlight>}} возвращает переменную среды по ее ключу
  
Example:
+
Пример:
  
 
<syntaxhighlight lang="pascal" line highlight="3,9">
 
<syntaxhighlight lang="pascal" line highlight="3,9">
Line 225: Line 201:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
It is also possible to load all environment variables to a {{Doc|package=RTL|unit=classes|identifier=tstringlist|text=<syntaxhighlight lang="delphi" inline>tStringList</syntaxhighlight> object}} and access to name-value pair easily.
+
Также можно загрузить все переменные среды в объект {{Doc|package=RTL|unit=classes|identifier=tstringlist|text=<syntaxhighlight lang="delphi" inline>TStringList</syntaxhighlight>}} и легко получить доступ к паре имя-значение. Списки строк автоматически учитывают символ-разделитель, который по умолчанию является знаком равенства [[=|(<syntaxhighlight lang="pascal" inline>'='</syntaxhighlight>)]].
String lists automatically take care of the separator character which is by defaut is an [[=|equal sign (<syntaxhighlight lang="pascal" inline>'='</syntaxhighlight>)]].
 
  
 
<syntaxhighlight lang="delphi" line highlight="4,7,9,15,21,23,26">
 
<syntaxhighlight lang="delphi" line highlight="4,7,9,15,21,23,26">
Line 240: Line 215:
 
 
 
try
 
try
// load all variables to string list
+
// загружаем все переменные в список строк
 
for i := 0 to getEnvironmentVariableCount() - 1 do
 
for i := 0 to getEnvironmentVariableCount() - 1 do
 
begin
 
begin
Line 259: Line 234:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
There is also a <syntaxhighlight lang="delphi" inline>tCustomApplication</syntaxhighlight> [[Method|method]] available to get all environment variables as a [[TStringList|<syntaxhighlight lang="delphi" inline>tStringList</syntaxhighlight>]] at once.
+
Существует также [[Method|метод]] <syntaxhighlight lang="delphi" inline>TCustomApplication</syntaxhighlight> для одновременного получения всех переменных среды в виде [[TStringList|<syntaxhighlight lang="delphi" inline>TStringList</syntaxhighlight>]]. Тогда схема может выглядеть так:
Then the pattern may look like this:
 
  
 
<syntaxhighlight lang="delphi">
 
<syntaxhighlight lang="delphi">
Line 276: Line 250:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
[[Category: Code]]
+
[[Category: Code/ru]]

Latest revision as of 20:54, 28 May 2022

English (en) español (es) suomi (fi) français (fr) русский (ru)

В большинстве (интерактивных) операционных систем программы можно запускать через интерфейс командной строки command line interface (CLI), что позволяет предоставлять программе дополнительные данные. Модули systemobjPas) предоставляют базовые функции для доступа к данным, предоставленным из командной строки.

Обзор

Хотя на этой странице говорится о параметрах командной строки и переменных среды, фактический интерфейс командной строки (CLI) не является обязательным требованием для использования таких данных, а также для использования процедур и терминологии, описанных здесь. Однако, поскольку интерфейс командной строки более осязаем, следующие инструкции в основном относятся к пользовательскому интерфейсу оболочки.

Терминология

Option (переключатели)
Опции - флаги yes/no. Обычно они имеют вид ‑‑dryrun/‑‑no‑dryrun (dryrun включен или отключен соответственно). Опции также называются «переключателями».
Parameter (параметр)
Параметры представляют собой кортежи ключ-значение. В командной строке они выглядят так: ‑‑processors 4.
Argument (аргумент)
Аргументы — это простые слова. В командной строке они обычно разделяются пробелами (назначают переменную IFS в некоторых оболочках). В узком смысле, аргументы — это все предоставленные слова, которые не являются ни опциями, ни (частью) параметров. В общем, аргументы — это все слова в командной строке, которые никак не интерпретируются.
Environment variable (переменные окружения)
Переменные окружения относятся к помеченной части хранилища в среде. Это пары имя-значение.

Обратите внимание, CLI/OS предоставляет программе только те аргументы, которые она должна получить: например, экранированные символы новой строки, перенаправление файла (каналы или в файл) и присвоение переменных среды не будут перенаправлены в программу.

Основы

Поскольку понятия «опция» и «параметры» уже являются своего рода высокоуровневыми, существуют разные стили (короткие опции против длинных опций), и модуль system стремится предоставить базовые средства для работы, все аргументы командной строки просто перечисляютсяить, начиная с нуля. Никакой интерпретации не делается.

Функция paramStr возвращает n-й аргумент в командной строке. ParamStr(0) пытается вернуть имя и, возможно, полный путь к исполняемому программному файлу.

Параметры командной строки

Основы

Программа на Паскале может получить доступ к аргументам командной строки, используя функциюparamStr в сочетании с paramCount. ParamCount возвращает количество предоставленных аргументов.

program listArguments(input, output, stdErr);
{$mode objFPC}
var
	i: integer;
begin
	writeLn({$ifDef Darwin}
			// в Mac OS X возвращаемое значение зависит от метода вызова
			'This program was invoked via: ',
		{$else}
			// Turbo Pascal-совместимый paramStr(0) возвращает местоположение
			'This program is/was stored at: ',
		{$endIf}
		paramStr(0));
	
	for i := 1 to paramCount() do
	begin
		writeLn(i:2, '. argument: ', paramStr(i));
	end;
end.

Запуск этой программы (на не-Mac OS Ⅹ платформе) может выглядеть следующим образом:

$ ./listArguments foo bar able
This program is/was stored at: /tmp/listArguments
 1. argument: foo
 2. argument: bar
 3. argument: able

Модуль RTL system предоставляет версию paramStr, которая возвращает короткие строки shortString. Из-за особенностей реализации shortString ограничены 255 символами. Однако пользователь может указать более длинные аргументы командной строки.

Чтобы получить к ним доступ, модуль objPas переопределяет paramStr, который вместо этого возвращает строки ansiString, которые не имеют этого ограничения длины. Модуль objPas автоматически включается в режимы компилятора {$mode objFPC} (строка2) и {$mode Delphi}.

Распределенная функция paramStr пытается быть совместимой с Turbo Pascal. В TP paramStr(0) возвращает местоположение программы. Однако операционная система должна поддерживать это. В частности, в Mac OS Ⅹ значение paramStr(0) зависит от метода вызова, от того, как запускается приложение.

Light bulb  Примечание: Поскольку paramStr(0) зависит от функциональности ОС, он не подходит для кроссплатформенных программ.
Light bulb  Примечание: На юниксоидных платформах невозможно точно определить местоположение файла только по строке. Может быть несколько жестких ссылок, указывающих на один и тот же индексный дескриптор, файл мог быть уже удален, части пути к файлу могли измениться, помимо других деталей. По этим причинам paramStr(0) на юниксоидных платформах бесполезен.

Модуль getOpts предоставляет несколько других подпрограмм для вызова программы в соответствии с определенным стилем.

Простота использования

Хорошая программа должна выдавать справочное сообщение при вызове с неправильными параметрами и должна следовать общепринятому способу предоставления параметров. Модуль custApp, поставляемый с FPC, предоставляет класс TCustomApplication, предоставляющий функции для простой проверки и чтения параметров. Конечно, вы по-прежнему можете получить доступ к параметрам напрямую через paramStr и paramCount.

Каждое приложение LCL использует это автоматически. Объект Application — это TCustomApplication.

Если вы хотите написать не LCL-программу, то создайте в Lazarus новый проект типа «Консольное приложение». Это создаст файл project1.lpr с некоторыми приятными дополнениями, которые нужны почти всем программам. Перейдите к методу doRun.

Проверка параметра

С TCustomApplication вы можете получить доступ к параметрам по имени. Например, ваша программа должна выводить текст справки, когда пользователь задает общий параметр справки -h. -h является коротким вариантом параметра. Длинная форма --help. Чтобы проверить, вызвал ли пользователь программу с помощью -h или --help, вы можете использовать следующий код:

if hasOption('h', 'help') then
begin
	writeHelp;
	halt;
end;
Light bulb  Примечание: В LCL-форме вы должны добавить application. перед hasOption.

Например:

if application.hasOption('h', 'help') then
begin
	writeHelp;
	halt;
end;

Если вы хотите поддерживать только короткий вариант, используйте:

if hasOption('h', '') then

Если вы хотите поддерживать только длинный вариант, используйте:

if hasOption('help') then

Чтение значения параметра

Каждому параметру может быть присвоено значение. Например:

$ project1 -f filename

или в длинной форме:

$ project1 --file=filename

Чтобы получить filename, используйте:

writeLn('f=', getOptionValue('f', 'file'));
Light bulb  Примечание: если вы получаете сообщение об ошибке "Option at position 1 needs an argument : f." (Переключатель в позиции 1 нуждается в аргументе: f), то вы забыли добавить опцию при вызове checkOptions.

Проверка параметров на валидность

Параметры командной строки представляют собой произвольный текст, поэтому пользователь при вводе может легко допускать ошибки. Отсюда проверка синтаксиса параметров обязательна. Для этого вы можете использовать метод CheckOptions.

Вы можете определить, какие параметры разрешены, какие из них нуждаются в параметре, а в случае синтаксической ошибки вы можете получить сообщение об ошибке, а также неправильные параметры для печати полезных и подробных ошибок.

Пример:

errorMsg := checkOptions('hf:', 'help file:');

Это позволяет передавать короткие переключатели: ‑f value и ‑h.
Это - передавать длинные переключатели: ‑‑help или ‑‑file=filename.
А это не позволяет передачу параметра ‑‑help со значением или ‑‑file без значения.

Пример передачи параметра:

procedure TMainForm.FormShow(Sender: TObject);
var
    I: Integer;
    Params : TStringList
    LongOpts : array [1..2] of string = ('debug-sync', 'config-dir:');
begin
    Params := TStringList.Create;
    try
        Application.GetNonOptions('hgo:', LongOpts, Params);
        for I := 0 to Params.Count -1 do
            debugln('Extra Param ' + inttostr(I) + ' is ' + Params[I]);  }
    finally
        FreeAndNil(Params);
    end;
end;

Этот пример находит параметры и не смешивает их с переключателями или параметрами командной строки. В этом примере приложение также принимает параметры --debug-sync и --config-dir=somedir, но здесь они не указаны.

Обратите внимание, что Application.GetNonOptions() принимает длинные параметры в виде массива, а Application.CheckOptions принимает те же данные, но в виде строки. Немного грустно!

Переменные окружения

Модуль sysUtils определяет три основные функции для получения переменных среды.

Пример:

 1program environmentVariablesList(input, output, stdErr);
 2uses
 3	sysUtils;
 4var
 5	i: integer;
 6begin
 7	for i := 0 to getEnvironmentVariableCount() - 1 do
 8	begin
 9		writeLn(getEnvironmentString(i));
10	end;
11end.

Также можно загрузить все переменные среды в объект TStringList и легко получить доступ к паре имя-значение. Списки строк автоматически учитывают символ-разделитель, который по умолчанию является знаком равенства ('=').

 1program environmentVariablesSorted(input, output, stdErr);
 2{$mode objFPC}
 3uses
 4	classes, sysUtils;
 5var
 6	i: integer;
 7	environmentVariables: tStringList;
 8begin
 9	environmentVariables := tStringList.create();
10	
11	try
12		// загружаем все переменные в список строк
13		for i := 0 to getEnvironmentVariableCount() - 1 do
14		begin
15			environmentVariables.append(getEnvironmentString(i));
16		end;
17		
18		environmentVariables.sort;
19		for i := 0 to environmentVariables.count - 1 do
20		begin
21			writeLn(environmentVariables.names[i]:20,
22				' = ',
23				environmentVariables.valueFromIndex[i]);
24		end;
25	finally
26		environmentVariables.free;
27	end;
28end.

Существует также метод TCustomApplication для одновременного получения всех переменных среды в виде TStringList. Тогда схема может выглядеть так:

var
	environmentVariables: tStringList;
begin
	environmentVariables := tStringList.create();
	try
		application.getEnvironmentList(environmentVariables);
		
	finally 
		environmentVariables.free;
	end;
end;