Что происходит, если я передаю слишком мало параметров функции оболочки?

[1133281]Да, это можно сделать:[12161]Затем выполняется первый files.py и вывод (Пример: "file1.txt file2.txt") является входным для cmd.py. [12162]Пример: [12163]Это "кошка" всех файлов, найденных ls в рабочей директории.[1133288].
2
27.03.2015, 01:02
3 ответа

Bash не проверяет количество аргументов, переданных на функцию, потому что нет прототипов, что и в C. из https://www.gnu.org/software/bash/manual /bash.html#shell-function:

shell Функции - это способ групповых команд для последующего выполнения одно имя для группы. Они выполняются как «регулярные» команда. Когда имя функции оболочки используется в качестве простой команды Имя, список команд, связанных с этим именем функции, выполнено. Функции оболочки выполняются в текущем контексте оболочки; Новый процесс не создан для их интерпретации.

Функции объявлены с использованием этого синтаксиса:

Имя () Соединение-команда [Перенаправления]

или

Имя функции [(()] Соединение-команда [Перенаправления]

Один контроль внутри функции Количество аргументов правильно и возвращает ошибку, если она не обязана не ответственностью. Смотрите:

#!/bin/bash

function f()
{
    echo $1
}

function f1
{
    echo $1
}

f
f 2
f1
f1 f1
0
27.01.2020, 23:10

Функция, как внешняя команда, получает список параметров. Там нет способа определить функцию, которая требует определенного количества параметров. Код функции может проверить количество параметров и их значение и испускать сообщения об ошибках, если это желает.

Количество параметров, передаваемых в текущую функцию, доступно в специальной переменной $ # . Если вы используете пронумерованный параметр, который больше, чем количество фактических параметров, этот параметр является unsot, поэтому, если вы попытаетесь получить доступ к нему, вы получаете пустую строку. Например, со следующим определением:

f () {
  echo "$#" "[[$2]]"
}
  • F отпечатки 0 [[]] . Поскольку нет параметра № 2, $ 2 расширяется до пустой строки.
  • F Один печатает 1 [[[]] , по тем же причинам.
  • F Один два принты 2 [[два]] .
  • F Один два три отпечаток 3 [[два]] . Функция случается не делать ничего с третьим параметром, но это нормально.
-1
27.01.2020, 23:10

Это примерно так же нежелательно, как и другие ответы, но, возможно, менее неэффективно:

locate --regex --basename "xfce4-keyboard-overlay$" | 
        while IFS= read -r f; do [ -f "$f" ] && printf "%s\n" "$f"; done

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

Подход «давайте поместим в нечто» может быть обречен на провал если присутствуют пути, содержащие новые строки.


Для получения дополнительной информации о IFS см. sh (1) или bash (1) (путем ввода man sh или man bash в систему * nix, и/или чтение его здесь , здесь , здесь , и/или здесь ). Затем прочтите Общие сведения о IFS . и Bash: чтение строки за строкой, с IFS на Stack Exchange (фокус на ответы с более чем 5 голосами), и, если вам все еще не хватило, Проверьте IFS на вики Грега и Результаты поиска IFS на вики Bash Hackers (не на Stack Exchange).

-121--35700-

Сначала я попробовал родительские процессы strace, такие как systemd и Xorg.bin, но я новичок в strace, так что я не могу понять.

Тогда я подумал, что это может быть связано с вопросом разрешения (su -, sudo,... и т.д.). Поэтому я планирую нажать клавишу быстрого вызова как root. Так что я быстро понял, что могу использовать sudo xdotool ключ Super + s для его тестирования. Тогда что меня удивляет, так это работает!

Поэтому я пытаюсь xdotool ключ Super + s без sudo и это все еще работает. Итак, я пришел к выводу, что клавиша xdotool Super + s работает нормально, но все же я не могу понять, какая разница между клавишей xdotool и клавишей, нажатой из журнала strace.

Тогда я выхожу из идеи, что если я поставлю xdotool ключ Super + s в качестве пользовательского ярлыка? Так я создал новый пользовательский ярлык Super + J и привязать к команде xdotool ключ Super + s , в котором Super + s уже привязать к команде scrot -s . И это просто работает, когда я нажимаю Super + j

я протестировал gnome-screenshot -a и scrot -s и оба работают как шарм.

[UPDATE] Я нашел эту ссылку , Выпуск 476: Xmonad должен выпустить привязку ключа перед нерестом :

Сообщается JohnTy...@gmail.com, 18 сентября 2011 г.

Используя scrot здесь, чтобы сделать снимки экрана. Скрот захватывает клавиатуру, чтобы прослушать клавиатуру как сигнал к прерыванию. Если клавиатура отсутствует доступно, оно умирает с ошибкой:

giblib error: не удалось захватить клавиатуру: ресурс временно недоступно

Чтобы проверить:

привязать «scrot-s >/tmp/logfile» к клавиатуре в xmonad.hs

Активировать клавиатуру, ничего не происходит.

Проверьте файл журнала, найдите указанную выше ошибку.

Я думаю, что это расовое условие, потому что связывание со "сном 0,2; scrot -s " работает здесь.Реальная проблема в том, что xmonad излишне висит на клавиатуре, и порожденное приложение ожидает его.

Какую версию продукта вы используете? На какой операционной системе? 0,9 .2/slackware linux

Он использует sleep для решения аналогичной проблемы. Я проверил его и он работает. Но я должен поместить его в сценарий оболочки, потому что пользовательская команда, похоже, не поддерживает & & или ; для объединения нескольких команд. Но время сна 0,2 иногда не работает для меня. Безопасный способ, конечно, увеличить до сна 0,5-1 секунду.

-121--244268-

Можно ссылаться на аргументы функции как на пронумерованные расширения в порядке их появления в командной строке при вызове функции. Если требуется наличие аргумента для того, чтобы функция могла работать, это можно сделать с помощью внутренней ссылки на ошибку - к рассматриваемому аргументу с помощью параметра-расширения.

echo1()(
    printf %s\\n \
    "${1?This function requires an argument!}"
)

Вышеперечисленное либо распечатает значение (при наличии) для первого аргумента функции, за которым следует новая строка для stdout и возврата 0, либо распечатает диагностическое сообщение в формате оболочки, содержащее фразу Эта функция требует аргумента! для stderr и возврата, отличного от 0, если аргументы отсутствуют.

Обратите внимание, что функция объявляется выполняющейся в субоболочке, например:

fn()( : body )

И не в текущей оболочке, например:

fn(){ : body; }

Это происходит потому, что форма подстановки параметров, используемая для повышения ошибки, приводит к выходу текущей оболочки - и если функция выполняется в текущей оболочке, это может привести к неожиданному выходу текущей оболочки. Однако это справедливо только для неинтерактивных оболочек. Например, независимо от того, была ли функция объявлена в оболочке, вышеупомянутая функция должна вести себя аналогично в любом случае, если вызывается из подсказки.

Но если бы функция была объявлена в текущей оболочке и выполнена в сценарии, сценарий прекратил бы выполняться в целом, если бы echo1 был вызван без каких-либо аргументов.

0
27.01.2020, 23:10

Теги

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