Задать вопрос
makc9I
@makc9I
фрилансер, web разработчик

Как сократить bash скрипт?

Всем привет. С nix системами на "вы", понадобилось на freebsd сервере написать простенький скрипт копирования некоторых файлов в домашний каталог пользователя, чтобы подсунуть этот скрипт планировщику задач.

Написал его как умею, втупую, вот так:
#!/bin/bash
cp -f /etc/squid/URLs/accessed/access.sorted /home/security/urls/
cp -f /etc/squid/URLs/accessed/oper_kass_url /home/security/urls/
cp -f /etc/squid/URLs/denied/deny.url.uniq /home/security/urls/
cp -f /etc/squid/groups/full.dom /home/security/groups/
cp -f /etc/squid/groups/limit.dom /home/security/groups/
cp -f /etc/squid/groups/oper_kass.dom /home/security/groups/
cp -f /etc/squid/groups/unlim.dom /home/security/groups/
cp -f /etc/squid/squid.conf /home/security/


Как я полагаю, писать cp столько раз не есть гуд, можно ли как-то сократить запись, но чтобы она выполняла тот же функционал, и главное, есть ли в этом смысл?
  • Вопрос задан
  • 2765 просмотров
Подписаться 7 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
gen1s
@gen1s
Не думаю, что в этом есть смысл (быстрее ничего точно не станет). Но можно писать и так:
#!/bin/bash
cp -f /etc/squid/URLs/accessed/{access.sorted,oper_kass_url} /home/security/urls/
cp -f /etc/squid/URLs/denied/deny.url.uniq /home/security/urls/
cp -f /etc/squid/groups/{full.dom,limit.dom,oper_kass.dom,unlim.dom} /home/security/groups/
cp -f /etc/squid/squid.conf /home/security/
Ответ написан
Если список файлов навсегда останется как есть -- то и так все нормально, только лучше бы #!/bin/bash поменять на #!/bin/sh

А вот если ожидается, что количество или расположение копируемых файлов будет хотя бы иногда меняться -- я бы сделала так:

#!/bin/sh

for file in \
    /etc/squid/URLs/accessed/access.sorted \
    /etc/squid/URLs/accessed/oper_kass_url \
    /etc/squid/URLs/denied/deny.url.uniq \
    ;
do
    cp $file /home/security/urls/
done

for file in \
    /etc/squid/groups/full.dom \
    /etc/squid/groups/limit.dom \
    /etc/squid/groups/oper_kass.dom \
    /etc/squid/groups/unlim.dom \
    ;
do
    cp $file /home/security/groups/
done

for file in \
    /etc/squid/squid.conf \
    ;
do
    cp $file /home/security/urls/
done


На скорость работы не влияет, по строчкам получается даже больше, чем в исходном варианте, и существенно больше, чем в предложении gen1s.
Зато исходные файлы и целевые каталоги разнесены по разным строкам, а это легче читается и проще правится. Если надо добавить копирование еще одного или нескольких файлов -- просто добавляем однотипные строки. Выкинуть файл из копирования -- удалить строку. Ошибиться невозможно ^_^

На всякий случай: после бекслешей не должно быть пробелов (это способ разбить длинную команду на несколько строк).
Ответ написан
Комментировать
bk0011m
@bk0011m
Системный администратор
Ну можно некоторые файлы по маске копировать.. Но зачем? Быстрее все равно не будет.
По моему и так норм. Это же не 100500 строк кода, а всего 9.

С другой стороны, для чего это копирование? Может симлинки просто сделать?
Ответ написан
iscsi
@iscsi
Зачем /bin/bash? Используйте везде, где можно /bin/sh!
Поддерживаю вариант.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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