Вы можете безопасно использовать ext3
с опцией noatime
: тогда только фактические записи файлов будут касаться вашего флэш-устройства в режиме записи. Журнал ext3fs - хорошая вещь для встроенной системы, которая может внезапно остаться без питания.
Я лично эксплуатировал таким образом несколько Raspberry PI, оснащенных простыми картами памяти SD, в течение нескольких лет (24/7, без резервного копирования UPS и с внезапными перебоями питания), и мне еще не приходилось заменять карты, и у меня не было никаких проблем с запуском после восстановления питания.
Что касается vfat
, как я уже говорил, журналирование является преимуществом.
Edit: более того, я запускаю их с rw-mounted root fs
Поскольку здесь уже используются bashisms, sed
, tr
или любой другой внешний инструмент бесполезны:
IFS='-' read -r -a host_name_array < <(hostname)
#removing the last part of string after last "-"
unset host_name_array[${#host_name_array[@]}-1]
shorted=${host_name_array[*]}
echo ${shorted// /-}
Это намного короче, быстрее и проще :
read myvar < <(hostname)
echo ${myvar%-*}
И если вам действительно нужен host_name_array
по другим причинам:
read shorted < <(hostname)
host_name_array=(${shorted//-/ })
shorted=${shorted%-*}
Итак, у вас есть массив и сокращенное имя хоста:
declare -p host_name_array shorted
вернет что-то вроде:
declare -a host_name_array='([0]="tech" [1]="news" [2]="blog" [3]="324344")'
declare -- shorted="tech-news-blog"
(...)
представляет подоболочку. Таким образом, $ URL
не будет установлен после этого (все еще будет иметь значение, которое было до подоболочки). Вы хотите:
IFS=-
read -r -a host_name_array <<< "$(hostname)"
unset 'host_name_array[${#host_name_array[@]}-1]'
URL="${host_name_array[*]}"
"$ {host_name_array [*]}"
объединяет элементы в массивах по первому символу $ IFS
точно так же, как "$ *"
. в стандарте sh
.
Если вы используете подоболочку потому, что вы не хотите изменять $ IFS
глобально, вы можете сделать это в функции, в которой вы указываете $ IFS
локальная область видимости:
f() {
local IFS=-
...
}
f
Или используйте подстановку команд, которая также создает подоболочку, но позволяет передавать данные в родительскую оболочку:
URL=$(IFS=-; printf '%s\n' "${host_name_array[*]}")
Хотя здесь я бы использовал стандартное расширение sh
, чтобы удалить этот конечный компонент:
URL=$(uname -n) # uname -n is the standard equivalent of hostname
URL=${URL%-*}
Он имеет несколько преимуществ по сравнению с вышеупомянутым:
-
, он ничего не удаляет, чтение <<< $ (имя хоста)
означает запуск имя хоста
, чтение его вывода через конвейер, сохранение его во временном файле и чтение
чтение первой строки из этого; bash
для запуска этого кода. Системный sh
будет достаточно. В любом случае, не забывайте заключать ваши переменные в кавычки при использовании их в контекстах списка:
printf '%s\n' "$URL"
При выполнении:
echo $ URL
Вы вызываете оператор split + glob. Итак, если $ IFS
по-прежнему содержит -
, этот $ URL
будет разделен на -
и echo
выведет эти слова, разделенные пробелами.
Когда IFS = '-' читать -r -a host_name_array <<< "$ (hostname)"
запущено, массив равен (блог технических новостей 324344)
.
После удаления последнего элемента с unset 'host_name_array [$ {# host_name_array [@]} - 1]'
, массив будет (блог технических новостей)
.
Итак, чтобы передать это в echo tech-news-blog
, необходимо будет выполнить некоторую замену, поскольку echo "$ {host_name_array [*]}"
даст блог технических новостей
:
С tr: echo "$ {host_name_array [*]}" | tr '' '-'
sed: echo "$ {host_name_array [*]}" | sed 's / / - / g'
Вы можете сделать это, выводя элементы, разделенные -
, а затем отделить последние -
путем расширения параметров:
$ var=$(printf '%s-' "${host_name_array[@]}")
$ echo "$var"
foo-bar-spam-egg-
$ var="${var%-}"
$ echo "$var"
foo-bar-spam-egg
Также вам нужно ${host_name_array[@]}
вместо ${host_name_array[*]}
, чтобы не выводить элементы целиком, разделенные первым символом IFS
.
То, что вы пытаетесь сделать, может быть достигнуто простым расширением параметров:
${var%-*}
Пример:
$ var=$(hostname)
$ echo "${var%-*}"