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
Функция, как внешняя команда, получает список параметров. Там нет способа определить функцию, которая требует определенного количества параметров. Код функции может проверить количество параметров и их значение и испускать сообщения об ошибках, если это желает.
Количество параметров, передаваемых в текущую функцию, доступно в специальной переменной $ #
. Если вы используете пронумерованный параметр, который больше, чем количество фактических параметров, этот параметр является unsot, поэтому, если вы попытаетесь получить доступ к нему, вы получаете пустую строку. Например, со следующим определением:
f () {
echo "$#" "[[$2]]"
}
F
отпечатки 0 [[]]
. Поскольку нет параметра № 2, $ 2
расширяется до пустой строки. F Один
печатает 1 [[[]]
, по тем же причинам. F Один два
принты 2 [[два]]
. F Один два три
отпечаток 3 [[два]]
. Функция случается не делать ничего с третьим параметром, но это нормально. Это примерно так же нежелательно, как и другие ответы, но, возможно, менее неэффективно:
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).
Сначала я попробовал родительские процессы 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 секунду.
Можно ссылаться на аргументы функции как на пронумерованные расширения в порядке их появления в командной строке при вызове функции. Если требуется наличие аргумента для того, чтобы функция могла работать, это можно сделать с помощью внутренней ссылки на ошибку - к рассматриваемому аргументу с помощью параметра-расширения.
echo1()(
printf %s\\n \
"${1?This function requires an argument!}"
)
Вышеперечисленное либо распечатает значение (при наличии) для первого аргумента функции, за которым следует новая строка для stdout и возврата 0, либо распечатает диагностическое сообщение в формате оболочки, содержащее фразу Эта функция требует аргумента! для stderr и возврата, отличного от 0, если аргументы отсутствуют.
Обратите внимание, что функция объявляется выполняющейся в субоболочке, например:
fn()( : body )
И не в текущей оболочке, например:
fn(){ : body; }
Это происходит потому, что форма подстановки параметров, используемая для повышения ошибки, приводит к выходу текущей оболочки - и если функция выполняется в текущей оболочке, это может привести к неожиданному выходу текущей оболочки. Однако это справедливо только для неинтерактивных оболочек. Например, независимо от того, была ли функция объявлена в оболочке, вышеупомянутая функция должна вести себя аналогично в любом случае, если вызывается из подсказки.
Но если бы функция была объявлена в текущей оболочке и выполнена в сценарии, сценарий прекратил бы выполняться в целом, если бы echo1
был вызван без каких-либо аргументов.