Вы на спичках экономите, на самом деле. Это не «лишний шаг», это одноразовое действие при загрузке машины, которое решает вашу проблему с «удалили директорию, покрешился демон» в полном объеме, без костылей с попытками предотвратить mv, о котором писал kekekeks.
И да, immutable для mount-а не нужен вообще в данном случае — зачем запрещать модификацию структуры директории? Пусть меняют, это их директория и их личные проблемы.
Просто назначьте логи в другое место, в которое у гостей доступа не будет, а это другое место просто примонтируйте к локальной директории гостя через -o bind. Если удалит — сам себе злобный буратино, но зато никто больше не пострадает.
Если бы у меня не было оснований сомневаться в правдивости изложенного, я бы не задавал такой вопрос. Однако квалификации, чтобы однозначно назвать это бредом, у меня нет. Слова-маркеры «якобы» и «без ссылок» могли бы подсказать скептический контекст моего вопроса.
О, как раз статья по теме! Давно читал вот это на Мембране, и, насколько я понял, некие ученые из NASA без ссылок утверждают, что капля металла, будучи расплавленная в невесомости и вакууме, и, стало быть, лишенная центров кристаллизации, застывает следующим образом:
И получает оптическую прозрачность и всяческие хитрые магнитные свойства. Несмотря на то, что картинка якобы с сайта NASA, я не смог найти ничего по теме. Собственно, в статье-то правду говорят? И если да, то почему так мало информации?
Да вы задрали с этим, серьезно. Вот этими вот сравнениями вы даете полноценный повод феминистической мразоте потом травить астрофизиков за принт рубашки и постить сравнения, чем именно собаки лучше мужчин. Нет ни малейшей разницы, кто шарит в коде, девушка или парень, если они действительно шарят. Если не шарят — пол тоже не оправдание. Мозг или есть, или его нет, и от пола это не зависит, и программирование ничем не отличается от любого другого скилла, который можно развить.
присваивание : ${VAR:='value'} лучше, чем просто VAR='value' тем, что если VAR уже назначен до вызова скрипта, то присваивания не произойдет — таким образом, HIDERRC и DESKTOP_ROOT можно переопределить через переменные окружения, при вызове в командной строке (HIDERRC=/private/etc/hiderrc DESKTOP_ROOT=/Applications/ hider.sh) или в каком-нибудь bash_profile на усмотрение.
затем же, зачем "${FOO}" вместо "$FOO" — это единый стиль без какого-то существенного обоснования. Насколько мне известно, фигурные скобки делают ничего.
локальные переменные — в нижнем регистре, глобальные — в заглавном, именование pascal_case-ом. опять же, на вкус и цвет… вы всегда можете форкнуть скрипт и исправить в нем то, что по вашему не так ;)
Без трекпада нет возможности пользоваться жестами, которые используются вообще везде — два пальца для прокрутки окон во всех направлениях и вызова центра уведомлений, зума, вращения, контекстных меню, трехпальцевое смахивание вниз для Exposé (список окон и документов активного приложения) и вверх для Mission Control (список пространств и приложений), трехпальцевое смахивание вбок для переключения между пространствами, трехпальцевые тапы для контекстных действий, четырехпальцевые комбинации для показа рабочего стола и launchpad, и так далее, и тому подобное. Эти комбинации удобно использовать именно так, как они есть — мышью выполнить их невозможно, а на клавиатуру маппить неудобно.
Покупка эппловской клавиатуры более опциональна, если есть возможность найти PC-клавиатуру с кнопкой Fn. Я когда-то мокрыми руками после душа потрогал клавиатуру своего ноутбука, пара капель воды попали внутрь и с тех пор у меня кнопка Fn не работает. Я не подозревал, насколько я часто ей пользуюсь, сам того не замечая, и теперь постоянно испытываю дичайшее неудобство от её нехватки. Fn-кнопка используется в том числе для регулировки яркости экрана, подсветки, громкости, навигации по плейлисту (которой я, правда, никогда не пользовался), навигации в пределах строки в терминале и т.д.
У PC-клавиатур иначе расположены модификаторы — Ctrl, Meta, Alt вместо Ctrl, Opt и Cmd. В принципе, с этим можно бороться при помощи Karabiner (бывший KeyRemap4Macbook), потому что иначе конформистский путь «использовать, как есть» искажает всю суть. К примеру — операция копирования в буфер обмена выполняется Cmd+C. Эти две кнопки находятся очень близко, и нажимаются сведенными указательным и большим пальцем без какого-то напряжения. На PC-клавиатуре пришлось бы нажать или Ctrl+C, для которого большой палец нужно заводить далеко назад к ладони, или Win+C, что всё еще не так удобно. Разница чувствуется, когда через удаленный рабочий стол заходишь на Windows-компьютеры. Еще примеры подобных сочетаний — переключение раскладки через Cmd+Space или вызов настроек через Cmd+,.
Единственный ощутимый минус Apple-клавиатур — отсутствие кнопки Insert, которая бывает нужна при удаленной работе с Windows-системами, и с этим ничего не поделать, кроме как назначать через тот же Karabiner её эмуляцию на комбинацию вида Fn+Return или Fn+I.
По поводу избегания дубликатов при повторном запуске — вы натолкнули меня на мысль приделать к этим костылям велосипедный гудок.
#!/bin/bash
: ${DESKTOP_ROOT:='/usr/share/applications'}
: ${HIDERRC:="${HOME}/.hiderrc"}
function trim() {
local s="${@}";
s="${s#"${s%%[![:space:]]*}"}"; # trim leading whitespace
s="${s%"${s##*[![:space:]]}"}"; # trim trailing whitespace
echo -n "${s}";
};
function describe() {
case "$1" in
'yes') echo -n 'hidden'; ;;
'no') echo -n 'visible'; ;;
esac;
};
function to_bool() {
case "$1" in
'yes') echo -n 'true'; ;;
'no') echo -n 'false'; ;;
esac;
};
function is_shortcut_hidden() {
local state='section';
local hidden='no';
while IFS='' read -r line; do
if [[ "${line}" == '#'* ]]; then {
continue; # skip over comment lines
} fi;
while [[ true ]]; do
case "${state}" in
'section')
if [[ "$(trim ${line})" == '[Desktop Entry]' ]]; then {
state='keyvalue';
} fi;
;;
'keyvalue')
if [[ "${line}" == '['*']' ]]; then {
state='section';
continue; # reinterpret current section
} else {
IFS='=' read -r key value < <(echo "${line}");
if [[ "$(trim ${key})" == "NoDisplay" ]]; then {
case "$(trim ${value})" in
'0' | 'false') hidden='no' ;;
'1' | 'true') hidden='yes' ;;
esac;
} fi;
} fi;
;;
esac;
break;
done;
done < "$1";
echo -n "${hidden}";
};
function read_rc() {
local section_hidden='yes';
local path;
local shortcut_hidden;
if [[ ! -r "${HIDERRC}" ]]; then {
return; # nothing to do if we have no conf
} fi;
while IFS='' read -r line; do
if [[ "${line}" == '#'* ]]; then {
continue; # skip over comment lines
} fi;
case "${line}" in
'[hide]') section_hidden='yes' ;;
'[show]') section_hidden='no' ;;
*)
if [[ "${line}" == '/'* ]]; then { # absolute path
path="${line}";
} else {
path="${DESKTOP_ROOT}/${line}";
} fi;
shortcut_hidden="$(is_shortcut_hidden "${path}")";
if [[ ! "${shortcut_hidden}" == "${section_hidden}" ]]; then { # action!
echo "Shortcut ${path} should be $(describe "${section_hidden}"), but is $(describe "${shortcut_hidden}")";
echo -n $'\n[Desktop Entry]\nNoDisplay='"$(to_bool "${section_hidden}")"$'\n' >> "${path}";
} fi;
;;
esac;
done < <(cat "${HIDERRC}"; echo);
};
read_rc;
пример ~/.hiderrc
# Just not needed for others to know that i have this in my system.
# I always can run them from cli. Вот
bleachbit-root.desktop
bleachbit.desktop
bum.desktop
gparted.desktop
guake.desktop
luakit.desktop
synaptic.desktop
teamviewer-teamviewer9.desktop
umit.desktop
virtualbox.desktop
wireshark.desktop
# Rubbish. То, что не запускаем отдельно,
# а открывается автоматически при открытии соответствующего файла,
# основываясь на file associations
AdobeAIR.desktop
caffeine-preferences.desktop
dropbox.desktop
empathy.desktop
evince.desktop
file-roller.desktop
gdebi.desktop
gthumb.desktop
gxneur.desktop
ibus-setup.desktop
libreoffice4.3-base.desktop
libreoffice4.3-calc.desktop
libreoffice4.3-draw.desktop
libreoffice4.3-impress.desktop
libreoffice4.3-math.desktop
libreoffice4.3-writer.desktop
noise.desktop
pantheon-terminal.desktop
totem.desktop
update-manager.desktop
vlc.desktop
# Скрыла, потому что эти приложения доступны из контекстного меню.
# Посчитала излишним дублировать их в меню. Время покажет права ли я.
atom.desktop
scratch-text-editor.desktop
scribes.desktop
sublime_text.desktop
пример синтаксиса ~/.hiderrc
# это комментарий!
# распознаются две секции - [show] и [hide].
# [show] делает все ярлыки в секции видимыми, [hide] их прячет.
# если секция не указана, то это считается [hide]
i_will_be_hidden.desktop
[show]
# если имя файла начинается с "/", считается, что это абсолютный путь к файлу
/absolute/path/to/file.desktop
# иначе имя файла считается относительным от пути в ${DESKTOP_ROOT}
relative/path/to/file.desktop
# секции могут повторяться и перемежаться
[hide]
foo.desktop
spaces are fine too.desktop
Этот скрипт можно закинуть в cron на выполнение раз в час, скажем, и он будет обновлять ярлыки, которые у него есть в списке, если их параметры видимости не отвечают требуемым. Содержимое .desktop-файлов корректно парсится, следуя вот этому.
mv, о котором писал kekekeks.И да, immutable для mount-а не нужен вообще в данном случае — зачем запрещать модификацию структуры директории? Пусть меняют, это их директория и их личные проблемы.
-o bind. Если удалит — сам себе злобный буратино, но зато никто больше не пострадает.И получает оптическую прозрачность и всяческие хитрые магнитные свойства. Несмотря на то, что картинка якобы с сайта NASA, я не смог найти ничего по теме. Собственно, в статье-то правду говорят? И если да, то почему так мало информации?
: ${VAR:='value'}лучше, чем простоVAR='value'тем, что еслиVARуже назначен до вызова скрипта, то присваивания не произойдет — таким образом,HIDERRCиDESKTOP_ROOTможно переопределить через переменные окружения, при вызове в командной строке (HIDERRC=/private/etc/hiderrc DESKTOP_ROOT=/Applications/ hider.sh) или в каком-нибудь bash_profile на усмотрение.Без трекпада нет возможности пользоваться жестами, которые используются вообще везде — два пальца для прокрутки окон во всех направлениях и вызова центра уведомлений, зума, вращения, контекстных меню, трехпальцевое смахивание вниз для Exposé (список окон и документов активного приложения) и вверх для Mission Control (список пространств и приложений), трехпальцевое смахивание вбок для переключения между пространствами, трехпальцевые тапы для контекстных действий, четырехпальцевые комбинации для показа рабочего стола и launchpad, и так далее, и тому подобное. Эти комбинации удобно использовать именно так, как они есть — мышью выполнить их невозможно, а на клавиатуру маппить неудобно.
Покупка эппловской клавиатуры более опциональна, если есть возможность найти PC-клавиатуру с кнопкой
Fn. Я когда-то мокрыми руками после душа потрогал клавиатуру своего ноутбука, пара капель воды попали внутрь и с тех пор у меня кнопкаFnне работает. Я не подозревал, насколько я часто ей пользуюсь, сам того не замечая, и теперь постоянно испытываю дичайшее неудобство от её нехватки. Fn-кнопка используется в том числе для регулировки яркости экрана, подсветки, громкости, навигации по плейлисту (которой я, правда, никогда не пользовался), навигации в пределах строки в терминале и т.д.У PC-клавиатур иначе расположены модификаторы —
Ctrl,Meta,AltвместоCtrl,OptиCmd. В принципе, с этим можно бороться при помощи Karabiner (бывший KeyRemap4Macbook), потому что иначе конформистский путь «использовать, как есть» искажает всю суть. К примеру — операция копирования в буфер обмена выполняетсяCmd+C. Эти две кнопки находятся очень близко, и нажимаются сведенными указательным и большим пальцем без какого-то напряжения. На PC-клавиатуре пришлось бы нажать илиCtrl+C, для которого большой палец нужно заводить далеко назад к ладони, илиWin+C, что всё еще не так удобно. Разница чувствуется, когда через удаленный рабочий стол заходишь на Windows-компьютеры. Еще примеры подобных сочетаний — переключение раскладки черезCmd+Spaceили вызов настроек черезCmd+,.Единственный ощутимый минус Apple-клавиатур — отсутствие кнопки Insert, которая бывает нужна при удаленной работе с Windows-системами, и с этим ничего не поделать, кроме как назначать через тот же Karabiner её эмуляцию на комбинацию вида
Fn+ReturnилиFn+I.Этот скрипт можно закинуть в cron на выполнение раз в час, скажем, и он будет обновлять ярлыки, которые у него есть в списке, если их параметры видимости не отвечают требуемым. Содержимое .desktop-файлов корректно парсится, следуя вот этому.
$, а C-строковый литерал. В вашем варианте следовало бы писатьecho -ne, иначе\nбудет выведен, как есть.