Сценарий Bash для безопасного создания символьных ссылок?

Я пытаюсь сохранить все свои конфигурационные файлы профиля (~/.xxx) в мерзавце. Я довольно ужасен в сценариях удара, но я предполагаю, что это будет довольно прямым для Вас пишущий сценарий гуру.

В основном я хотел бы сценарий, который создаст символьные ссылки в моем корневом каталоге в файлы в моем repo. Скручивание, я хотел бы его, предупреждают и запрашивают перезапись, если символьная ссылка будет перезаписывать фактический файл. Это должно также запросить, если символьная ссылка будет перезаписанной, но путь назначения отличается.

Я не возражаю вручную редактировать сценарий для каждой ссылки, которую я хочу создать. Я более обеспокоен способностью быстро развернуть новые сценарии конфигурации путем запущения этого скрипта, сохраненного в моем repo.

Какие-либо идеи?

9
задан mdb 8 August 2010 в 15:54
поделиться

2 ответа

Команда ln уже консервативна в отношении стирания, поэтому, возможно, вам подходит подход KISS:

ln -s git-stuff/home/.[!.]* .

Если файл или ссылка уже существует, вы получите сообщение об ошибке и эту ссылку будут пропущены.

Если вы хотите, чтобы файлы имели другое имя в вашем репозитории, передайте параметр -n параметру ln , чтобы случайно не создать символическую ссылку в существующем подкаталоге. с этим именем:

ln -sn git-stuff/home/profile .profile
...

Если вы также хотите иметь ссылки в подкаталогах вашего домашнего каталога, cp -as воспроизводит структуру каталогов, но создает символические ссылки для обычных файлов. С параметром -i он запрашивает, существует ли цель уже.

cp -i -as git-stuff/home/.[!.]* .

(В моем ответе предполагается, что GNU ln и GNU cp , например, вы можете найти в Linux (и Cygwin), но обычно не в других UNIX.)

14
ответ дан 4 December 2019 в 13:44
поделиться

Следующее имеет условия гонки, но это, вероятно, настолько безопасно, насколько вы можете получить без транзакций файловой системы:

# create a symlink at $dest pointing to $source
# not well tested
set -e   # abort on errors
if [[ ( -h $dest && $(readlink -n "$dest") != $source ) || -f $dest || -d $dest ]]
then
    read -p "Overwrite $dest? " answer
else
    answer=y
fi
[[ $answer == y ]] && ln -s -n -f -v -- "$source" "$dest"
1
ответ дан 4 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: