- Do I need to install these dependencies by source (also)? or if they are already installed by package manager, that could also work?
Если они уже установлены менеджером пакетов, это будет работать, если установленная версия соответствует требованиям исходного кода, который вы пытаетесь собрать.
Обратите внимание, что вам потребуются пакеты разработки, а не только пакеты библиотек; таким образом, для libsigc++ вам нужно libsigc++-2.0-dev
. Зависимости сборки пакета gtkmm помогут вам начать работу :
sudo apt build-dep gtkmm3.0
Для статической компоновки вам, вероятно, потребуется собрать все из исходного кода; большинство пакетов разработки в Debian не поставляются с библиотеками для статической компоновки.
- How can I check if these packages are installed by the package manager?
dpkg -l
или, если вы ищете конкретный файл, dpkg -S
.
- Also, if the dependencies are installed by source, where should those be installed?
Исходный код можно разместить где угодно. Артефакты сборки обычно должны быть установлены в /usr/local
, что является расположением по умолчанию, используемым в большинстве проектов.
Ваш код использует temp3
в качестве команды. Иногда кажется, что код оболочки смешивается с чем-то, что может быть Python. Оболочка не выполняет конкатенацию с +
. Вы также не можете помещать имена файлов в строковую переменную, а затем извлекать их из этой строки, не ограничивая строго поддерживаемые типы имен. Лучше использовать реальную переменную массива для списков вещей.
Предполагая, что вам нужен обычный выходной формат sha256sum
для ваших файлов, и каждый префикс (в той же строке )с выводомdate
:
#!/bin/bash
files=(
blocklists/blocklist.txt
whitelists/whitelist.txt
)
now=$(date)
for filepath in "${files[@]}"; do
printf '%s\n' "$now" |
paste -d : - <( sha256sum -- "$filepath" )
done >sha256.md
Здесь используется массив для файлов (это позволяет использовать все возможные имена файлов, а также имена файлов с пробелами, символами новой строки и подстановочными символами ), и он использует paste
для создания двух столбцов с выводом date
в первом столбце и вывод sha256sum
в другом. Два столбца разделены :
.
Изменение этого скрипта для запуска под любыми именами, которые вы укажете в командной строке скрипта, и запись вывода в стандартный вывод:
#!/bin/bash
now=$(date)
for filepath do
printf '%s\n' "$now" |
paste -d : - <( sha256sum -- "$filepath" )
done
Вы бы использовали это вот так:
$./myscript blocklists/blocklist.txt whitelists/whitelist.txt >sha256.md
Или,вы можете избавиться от необходимости зацикливания и просто вызвать sha256sum
со всеми заданными путями:
#!/bin/bash
sha256sum "$@" |
awk -v now="$(date)" -v OFS=: '{ print now, $0 }'
Эта строка не делает ничего полезного в синтаксисе bash:
temp3 + " : " + temp2 >> sha512.md
Это означает «взять строку temp3
и запустить ее как команду, передав ее + " : " + temp2
в качестве аргументов и добавить вывод в файл sha512.md
». Вот рабочая версия вашего скрипта:
#! /usr/bin/env bash
FILES="
blocklists/blocklist.txt
whitelists/whitelist.txt
"
main() {
echo "sha512"
func_sha512sum
cat sha512.md
}
func_sha512sum() {
for file in $FILES
do
printf '%s : %s\n' \
"$(date)" \
"$(sha512sum -- "$file")" >> sha512.md
done
}
main
Лично я бы избегал жесткого кодирования имен файлов, так как это сильно ограничивает сценарий. Просто возьмите файлы из аргументов и выведите на стандартный вывод:
#! /usr/bin/env bash
for file in "$@"; do
printf '%s : %s\n' \
"$(date)" \
"$(sha512sum -- "$file")"
done
Затем вы запустите его следующим образом:
$ foo.sh whitelists/whitelist.txt blocklists/blocklist.txt
Fri Apr 23 10:11:10 AM BST 2021 : a61788166e55f4fbac36f7c9b5a35b80d79eaee684e247caa1e3985a0b78a0edd2c04cacad017b077250c91ced64894d3ae17204df684e09020d7d2569414c5c blocklists/blocklist.txt
Fri Apr 23 10:11:10 AM BST 2021 : 6b29fcb04c0c19abda792b6efb41f317d8a6af63daad74c0eb82ac7dee7be88d87242fb36b56c63581f109d8cb50969b519935d23b9c5223af1c69a4e3ac5ef5 whitelists/whitelist.txt