При выполнении сценария оболочки действительно ли возможно передать определенные позиционные параметры, не имея необходимость вводить их всех в порядок?

Если Вы требуете доступа к своему рабочему столу Linux и Xming и собственная поддержка X11 предложения Cygwin/X, которая должна быть более быстро реагирующей, чем решение VNC.

13
07.09.2014, 15:22
2 ответа

Другой способ сделать это - назвать параметр, который вы хотите объявить, а затем сделать это:

{   cat >./foo 
    chmod +x ./foo
    eight=declared ./foo
    eight=declared_and_preferred \
        ./foo 1 2 3 4 5 6 7 8
    ./foo 1 2 3 4 5 6 7 8
    ./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT

OUTPUT

$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default

В приведенном выше примере явно объявленная переменная окружения предпочтительнее аргумента командной строки, но аргумент командной строки используется, когда переменная окружения либо пуста, либо не задана. Когда и 8-я позиция , и переменная окружения $eight пуста или отменяется, значение по умолчанию some_default присваивается $eight. В любом случае : может быть удалено из операторов :- или :=, если пустое значение должно быть приемлемым.

Переменная $eight с тем же успехом могла бы быть установлена как:

printf '$eight = %s\n' "${eight:=${8:-some_default}}"

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

getopts - для робастных скриптов - часто является лучшим способом обработки опций команд . Позиционные параметры, с другой стороны, почти всегда являются самым простым средством робастной обработки операндов в сценарии.

Например:

touch file$(seq -ws\ file 100)
./foo *

OUTPUT

$eight = file008

Там мы видим только восьмой операнд, но есть 101 из них в глобусе из моего тестового каталога.

4
27.01.2020, 19:52

Это потому, что эти программы являются частью чашек , разработанных Apple.

То, что программа ( номер люкс) является открытым исходным кодом, не означает, что разработчик или компания (частично), оплачивающая разработку, не могут претендовать на авторские права на свои усилия.

-121--154438-

Функция current-message возвращает сообщение, отображаемое в данный момент в области эха , если таковое имеется. Ее можно вставить с помощью (вставить (текущее сообщение)) . Однако все, что заставляет что-либо другое занимать эхо-область, приведет к тому, что current-message возвратит nil .

Сообщения от Emacs архивируются в буфере * Messages * . Было бы полезнее захватить оттуда последнюю строчку. Это не совсем надежно, так как возможно иметь многострочное сообщение, но это редко: функция message предназначена для коротких сообщений, которые помещаются в одну строку.

Следующая функция вставляет последнее сообщение (точнее, последнюю строку из буфера * Messages * . При использовании аргумента префикса он возвращает более старые сообщения: 1 для последнего сообщения, 2 для следующего сообщения и т.д. Аргумент 0 вставляет (текущее сообщение) , если имеется.

(defun last-message (&optional num)
  (or num (setq num 1))
  (if (= num 0)
      (current-message)
    (save-excursion
      (set-buffer "*Messages*")
      (save-excursion
    (forward-line (- 1 num))
    (backward-char)
    (let ((end (point)))
      (forward-line 0)
      (buffer-substring-no-properties (point) end))))))
(defun insert-last-message (&optional num)
  (interactive "*p")
  (insert (last-message num)))

Свяжите его с ключом обычным способом. Например, если вы хотите, чтобы команда всегда была доступна на C-c m :

(global-set-key "\C-cm" 'insert-last-message)

Возможно, проще, чем вызвать две пользовательские команды для вставки имени файла, см. Emacs wiki .

Чтобы вставить выходные данные вычисления фрагмента Lisp с помощью C-x C-e , передайте аргумент префикса C-u C-x C-e .

-121--62600-

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

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

./foo bar

Если вы используете POSIX-совместимую оболочку , вы можете использовать утилиту getopts или программу getopt . bash - как и большинство оболочек - предлагает getopts в качестве встроенного. Любой способ проще, чем свернуть собственный синтаксический анализатор командной строки.

Если вы не реализуете что-то вроде последних X непозиционных аргументов являются значениями для последних Y аргументов и X-Y опционных аргументов, вы должны предоставить последовательности опций перед каждой из 7 (теперь пустых) последовательностей, если вы хотите установить любой из них. Однако это не является обычной практикой, обычно вариант всегда является вариантом, а аргумент - аргументом, и порядок «вставки» варианта является свободным.

18
27.01.2020, 19:52

Теги

Похожие вопросы