Быстрый ответ - это ввод в файл команд, например, chres
, а затем, в ответ на приглашение, команда командной консоли выполнить команды следующим образом:
$ sh chres
Если требуется выполнить команду из любого каталога, поместите команду в свой личный каталог bin
( $ HOME/bin
) и сделайте ее исполняемой ( ~
расширяется до полного пути к вашему каталогу HOME:
$ mkdir -p ~/bin
$ mv chres ~/bin
$ chmod +x ~/bin/chres
Убедитесь, что $ HOME/bin
находится в ПУТИ. Обычно это выполняется в ~ .profile
или ~ .bashrc
. Каталог ~/bin
может быть добавлен в PATH автоматически, если каталог существует. Можно полностью выйти из системы и снова войти в систему, чтобы узнать, требуется ли изменить .profile
. Для получения информации введите echo «$ PATH»
.
-121--243074-
Выглядит как неверный аргумент. Попробуйте
taskset -c 30 -p
-121--132928-
Синтаксис globbing можно поместить непосредственно в цикл for. Вам не нужно найти
вообще. И если вы используете глоббинг непосредственно в цикле for, вам не придется беспокоиться о разделении слов, так как оболочка заботится об этом автоматически.
Рекомендуется также цитировать переменные оболочки, когда они появляются в командах, иначе они будут подвергнуты разделению слов после подстановки.
Наконец, предпочтительнее printf
вместо echo
, так как он будет вести себя более корректно, если имя файла содержит определенные символы и является более переносимым в различных реализациях.
for PNG in *.png; do
pngquant --ext .png --force 256 "$PNG"
printf "Optimized PNG: %s\n" "$PNG"
done
В zsh и bash с соответствующим набором опций можно выполнять рекурсивные глобусы так:
for PNG in **/*.png; do
pngquant --ext .png --force 256 "$PNG"
printf "Optimized PNG: %s\n" "$PNG"
done
Это приведет к тому, что поиск опустится в подкаталоги, как это делает команда find
. Однако это не стандарт POSIX, поэтому, если вам нужно что-то, чтобы работать портально во всех POSIX-подобных системах, вы должны использовать один из других ответов.
Неполный ответ, но я выяснил некоторые детали, просмотрев исходный код.
Я просмотрел исходный код xset
в файле xset.c
, который входит в состав пакета x11-xserver-utils
. Код в файле, загруженном в мою систему (Ubuntu 16.04 )автором apt-get source x11-xserver-utils
, более или менее совпадает с кодом, найденным здесь , поэтому я буду использовать код на этой странице в качестве ссылки..
Что происходит, когда указана опция mouse
, можно увидеть в L475 -502 (EDIT :в обновленной ссылке L450 -475 ):
/* Set pointer (mouse) settings: Acceleration and Threshold. */
else if (strcmp(arg, "m") == 0 || strcmp(arg, "mouse") == 0) {
acc_num = SERVER_DEFAULT; /* restore server defaults */
acc_denom = SERVER_DEFAULT;
threshold = SERVER_DEFAULT;
if (i >= argc){
set_mouse(dpy, acc_num, acc_denom, threshold);
break;
}
arg = argv[i];
if (strcmp(arg, "default") == 0) {
i++;
}
else if (*arg >= '0' && *arg <= '9') {
acc_denom = 1;
sscanf(arg, "%d/%d", &acc_num, &acc_denom);
i++;
if (i >= argc) {
set_mouse(dpy, acc_num, acc_denom, threshold);
break;
}
arg = argv[i];
if (*arg >= '0' && *arg <= '9') {
threshold = atoi(arg); /* Set threshold as user specified. */
i++;
}
}
set_mouse(dpy, acc_num, acc_denom, threshold);
}
где SERVER_DEFAULT
устанавливается как -1
. Это просто читает аргументы и вызывает set_mouse
. Примечательно, что если никакие дополнительные аргументы не заданы, команда (называется xset mouse
), значения по умолчанию — xset mouse -1/-1 -1
. Кроме того, acc_num
и threshold
должны быть в диапазоне от 0 до 9, в противном случае используется значение по умолчанию -1
, а значение по умолчанию для acc_denom
равно 1.
Функция set_mouse
снова представляет собой набор проверок на наличие недопустимых входных значений:
set_mouse(Display *dpy, int acc_num, int acc_denom, int threshold)
{
int do_accel = True, do_threshold = True;
if (acc_num == DONT_CHANGE) /* what an incredible crock... */
do_accel = False;
if (threshold == DONT_CHANGE)
do_threshold = False;
if (acc_num < 0) /* shouldn't happen */
acc_num = SERVER_DEFAULT;
if (acc_denom <= 0) /* prevent divide by zero */
acc_denom = SERVER_DEFAULT;
if (threshold < 0) threshold = SERVER_DEFAULT;
XChangePointerControl(dpy, do_accel, do_threshold, acc_num,
acc_denom, threshold);
return;
}
Теперь мяч передан XChangePointerControl
. Однако эта функция не определена в этом пакете. Поиск по включенным зависимостям привел меня к пакету libx11
, содержащему файлChPntCont.c
(исходный код здесь ), который определяет эту функцию:
int
XChangePointerControl(
register Display *dpy,
Bool do_acc,
Bool do_thresh,
int acc_numerator,
int acc_denominator,
int threshold)
{
register xChangePointerControlReq *req;
LockDisplay(dpy);
GetReq(ChangePointerControl, req);
req->doAccel = do_acc;
req->doThresh = do_thresh;
req->accelNum = acc_numerator;
req->accelDenum = acc_denominator;
req->threshold = threshold;
UnlockDisplay(dpy);
SyncHandle();
return 1;
}
Дальше этого момента я мало что понял. GetReq
определяется макросом в файле Xlibint.h
в пакете libx11
, и мы переключаемся между несколькими различными функциями. В конце концов, у нас, вероятно, достаточно информации из вышеупомянутых функций, поскольку входные значения, похоже, напрямую передаются как новые значения для одноименных свойств устройства с сенсорной панелью.
Вышеупомянутое, по крайней мере, говорит нам кое-что о значениях по умолчанию и принятых значениях xset
.
Мне не удалось выяснить, почему вывод xinput list-props
не обновляется после изменения свойств с помощью xset
.