Используйте xbindkeys
, он создает глобальные сочетания клавиш.
DESCRIPTION
XbindKeys is a program that grab keys and mouse button events in X and
starts associated shell command.
Я бы предложил использовать массив для такой задачи (задач)
mapfile -t -O 1 var <input.txt
, чтобы у вас была каждая строка в $ {var [1]}
, $ {var [2] }
и так далее
Это не совсем то, о чем вы просили, но это может сработать для ваших нужд. Вы можете сериализовать данные с помощью Awk. Обратите внимание, что это не работает, если ваш $ 1 не является допустимым именем переменной:
awk '
function quote(str, d, m, x, y, z) {
d = "\47"; m = split(str, x, d)
for (y in x) z = z d x[y] (y < m ? d "\\" d : d)
return z
}
{
print $1 "=" quote($0)
}
' input.txt > /tmp/input.sh
. /tmp/input.sh
Результат:
$ echo "$line1"
line1 foo foobar bar
You ' d do:
unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt
Или:
{ line1=$(line) && line2=$(line); } < input.txt
(менее эффективно, так как строка
редко бывает встроенной, и большинству оболочек требуется разветвление для реализации подстановки команд. строка
также больше не является стандартная команда).
Чтобы использовать цикл:
unset -v line1 line2 line3
for var in line1 line2 line3; do
IFS= read -r "$var" || break
done < input.txt
Или автоматически определять имена переменных как line <++ n>
:
n=1; while IFS= read -r "line$n"; do
n=$((n + 1))
done < input.txt
Обратите внимание, что bash
поддерживает переменные массива и встроенная функция readarray
для чтения строк в массив:
readarray -t line < input.txt
Однако обратите внимание, что, в отличие от большинства других оболочек, индексы массива bash
начинаются с 0, а не с 1 (унаследовано от ksh
), поэтому первая строка будет в $ {line [0]}
, а не в $ {line [1]}
(хотя , как показал @Costas , вы можете заставить readarray
(он же mapfile
) начать записывать значения с индексом 1 ( bash
массивы также вопреки тому, что большинство других оболочек являются разреженные массивы) с -O 1
).
См. Также: Что такое «IFS = read -r line»?