ALT + F2
и введите r
Я смог уменьшить панель заголовков приложений на Gnome 3.20 с помощью следующего CSS:
headerbar entry,
headerbar spinbutton,
headerbar button,
headerbar separator {
margin-top: 0px; /* same as headerbar side padding for nicer proportions */
margin-bottom: 0px;
}
headerbar {
min-height: 24px;
padding-left: 2px; /* same as childrens vertical margins for nicer proportions */
padding-right: 2px;
margin: 0px; /* same as headerbar side padding for nicer proportions */
padding: 0px;
}
while
IFS= read -r a1 <&3 &&
IFS= read -r a2 <&4 &&
IFS= read -r a3 <&5 &&
IFS= read -r a4 <&6
do
./program "$a1" "$a2" "$a3" "$a4" 3<&- 4<&- 5<&- 6<&-
done 3< arg1.txt 4< arg2.txt 5< arg3.txt 6< arg4.txt
Цикл выполняется до тех пор, пока один из файлов не будет исчерпан. Замените &&
на ||
, чтобы запустить его до тех пор, пока все файлы не будут исчерпаны (используя пустые аргументы для более коротких файлов).
С GNU xargs
вы также можете сделать:
paste -d '\n' arg[1-4].txt | xargs -n 4 -r -d '\n' ./program
(хотя будьте осторожны, ./ program
stdin тогда будет / dev / null
)
В Bash (или какой-либо другой оболочке, поддерживающей $ ''
и массивы), это должно работать, если ваши входные файлы не 't contain tabs (*) :
IFS=$'\t'
paste arg1.txt arg2.txt |
while read -r -a A ; do
[ "${#A[@]}" -eq 2 ] && printf "%s - %s\n" ${A[@]}
done
paste
склеивает входные файлы построчно, read -a A
считывает столбцы в массив ] A
, используя табуляцию (из IFS
) в качестве разделителя. ["$ {# A [@]}" -eq 2]
проверяет, что в массиве ровно два члена, а $ {A [@]}
удаляет их в командной строке. из printf
. При необходимости измените команду.
(* если вам нужна поддержка вкладок, я бы перешел к использованию, например, Perl)
С этими входными файлами:
$ cat arg1.txt
foo bar
doo
$ cat arg2.txt
one
two two
three three three
Вывод из приведенного выше фрагмента:
foo bar - one
doo - two two
Последняя строка из arg2.txt
игнорируется, поскольку arg1.txt
не имеет соответствующей строки. read
игнорирует ведущие табуляции, что делает невозможным использование, если мы заботимся о том, в каких столбцах были пропущенные элементы.
Проверьте комбинацию команды sed и команды paste. Сначала используйте пасту, чтобы создать новый поток, состоящий из всех четырех файлов. Затем используйте sed, чтобы выбрать нужную строку:
paste arg1.txt arg2.txt arg3.txt arg4.txt | sed -n 10p
напечатает строку 10 вывода из вставки. Это можно передать программе в качестве аргументов с помощью xargs:
paste arg1.txt arg2.txt arg3.txt arg4.txt | sed -n 10p | xargs ./program
Если вы хотите перебрать строки, вы можете использовать команду seq для генерации последовательности, а затем перебирать каждое значение в последовательности:
for i in $(seq 1 100); do
paste arg1.txt arg2.txt arg3.txt arg4.txt | sed -n ${i}p | xargs ./program
done
Этот цикл будет медленным, так как он вызывает вставку один раз для каждой итерации. Вероятно, неплохо сначала создать временный файл.
Лучший вариант - это предварительное чтение файлов и хранение организованных результатов либо в массивах, либо во временных файлах. В противном случае вам придется вызывать функции чтения четыре раза на каждой итерации и заставлять функцию читать все дальше и дальше в файлах. Это далеко не оптимальный вариант.
Это версия для временных файлов. Осторожно, она не тестировалась.
PROG=./program
TEMPDIR=tmp
mkdir "$TEMPDIR"
# Create the temp files.
for arg in arg*.txt; do
i=0
while read a; do
((i++))
printf "%s\n" "$a" >> "$TEMPDIR"/"$i"
done < "$arg"
done
# Now the temp files are ready.
## Each file contains all arguments for 1 run of ./program,
## each of them on a separate line.
# Start executing the ./program.
for iteration in "$(ls "$TEMPDIR" | sort -n)"; do
unset args
while read arg; do
args=( "$arg" )
done < "$TEMPDIR"/"$iteration"
"$PROG" "${args[@]}"
done
# Finally, remove the temp files.
rm -r "$TEMPDIR"