Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Администрирование *NIX систем > не понимаю я поведение tar


Автор: mihanik 9.11.2011, 13:06
Если из командной строки я подаю команду

Код

tar -czvf /media/usbdisk/arhivy/'Архив баз 1С - 7.7 -`date`.tar.gz' /home/SharedFolder/1C_Bases/7.7/*


То всё классно отрабатывает.
Если же я КОПИРУЮ  ( smile ) эту же строку в скриптик, то у меня получается фигня.

Цитата

tar: Удаляется начальный `/' из имен объектов
/home/SharedFolder/1C_Bases/7.7/Kamin_AVANGARDN/
/home/SharedFolder/1C_Bases/7.7/Kamin_AVANGARDN/DH99.CDX
tar (child): /media/usbdisk/arhivy/Архив баз 1С - 7.7 -`date`.tar.gz: Функция open завершилась с ошибкой: Нет такого файла или каталога
tar (child): Error is not recoverable: exiting now
/home/SharedFolder/1C_Bases/7.7/Kamin_AVANGARDN/SC58.DBF
tar: /media/usbdisk/arhivy/Архив баз 1С - 7.7 -`date`.tar.gz: Функция write завершилась с ошибкой: Обрыв канала
tar: Error is not recoverable: exiting now


Чёй-то?
 smile 

Автор: Zerstroer 9.11.2011, 13:54
Предполагаю, что shell распознает как спецсимвол символ '/'.
Или что-то с кавычками не так.
Че-нить типа такого должно быть.
Код

'/media/usbdisk/arhivy/Архив баз 1С - 7.7 -\`date\`.tar.gz'

Не серчайте, если подсказал неправильно. smile 

Автор: newbee 9.11.2011, 14:13
А shell-то один и тот же используется в терминале и как обработчик скрипта?

Автор: mihanik 9.11.2011, 14:33
в скрипте я указал sh, а вот в консоли какой по умолчанию... Не помню.

Автор: bilbobagginz 9.11.2011, 16:40
не рекомендуется юзать пробелы, и делать двойное вложение раскрытия команд:
Код

'бла `блабла`'

(баш может и съел бы это, но большинство скриптов бегут из-под /bin/sh)
кроме того, пробелы в именах ни черта читабельности не дают.

рекомендуется следовать принципу KISS (Keep It Simple, Stupid)
Код

SRC="/home/SharedFolder/1C_Bases/7.7"
DST="/media/usbdisk/arhivy"
APP="1C_DBs_7.7"
D="`date`"
EXT="tar.gz"
TRG_NAME="${DST}/${APP}_${D}.${EXT}"
## двойные ковычки дают использовать и пробелы в именах, но это изначально дурной тон
tar -czvf "${TRG_NAME}" "${SRC}"/*

флажок v, тоже на фиг не упал. иначе надо вывод в /dev/null.
и проверять результат этой команды - тоже дядя будет.

Автор: mihanik 9.11.2011, 18:02
Цитата(bilbobagginz @  9.11.2011,  16:40 Найти цитируемый пост)
и проверять результат этой команды - тоже дядя будет.

 smile 

Пасиб!

Завтра попробую...

Добавлено через 1 минуту и 13 секунд
Цитата(bilbobagginz @  9.11.2011,  16:40 Найти цитируемый пост)
не рекомендуется юзать пробелы, и делать двойное вложение раскрытия команд:

Ага!
А сам-то!!!

Цитата(bilbobagginz @  9.11.2011,  16:40 Найти цитируемый пост)
D="`date`"


Автор: newbee 9.11.2011, 18:07
Небольшой оффтоп: по-моему `expr` совершенно нечитаемо, нагляднее делать $(expr).

Автор: bilbobagginz 9.11.2011, 20:38
Цитата(mihanik @  9.11.2011,  17:02 Найти цитируемый пост)
А сам-то!!!

ты прав. я не знаю почему, но мне показалось (или я както криво скопипастил), что было по-другому, так:
Код

"bla 'blabla `blab`'"

и указал только внутреннюю часть этого.
кстати, твой скрипт можно демонстрировать экспериментально (есть разница между: ' и "):
Код

kompik:~ user$ echo $SHELL
/bin/bash
kompik:~ user$ /bin/bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.
kompik:~ user$ x='bla `date`'
kompik:~ user$ echo $x
bla `date`
minik:~ user$ x="bla `date`"
kompik:~ user$ echo $x
bla Wed Nov 9 19:31:53 IST 2011

т.е. с ', он не запустил команду, а просто вставил текст.

Добавлено через 1 минуту и 37 секунд
newbee, если тебя волнует читаемость, пиши скрипты на питоне.

Автор: mihanik 9.11.2011, 21:26
bilbobagginz, вот я иногда не понимаю, когда ты шутишь, а когда серьёзно говоришь...
 smile  smile  smile 

Автор: bilbobagginz 9.11.2011, 23:34
Цитата(mihanik @  9.11.2011,  20:26 Найти цитируемый пост)
bilbobagginz, вот я иногда не понимаю, когда ты шутишь, а когда серьёзно говоришь...

я тут пишу. если бы ты слышал меня, было бы все понятно.
может подкасты начать записывать ?

Автор: newbee 9.11.2011, 23:47
Цитата(bilbobagginz @  9.11.2011,  21:38 Найти цитируемый пост)
newbee, если тебя волнует читаемость, пиши скрипты на питоне.
Зачем? Читаемость баш-скриптов хороша.

Автор: Lols 10.11.2011, 02:59
Ну что, проверил, работает?

Автор: mihanik 10.11.2011, 10:47
Ну... Что сказать...

Вместо 3-х строк 

Код

tar -czvf /media/usbdisk/arhivy/'Архив баз 1С - 7.7 -`date`.tar.gz' /home/SharedFolder/1C_Bases/7.7/*
tar -czvf /media/usbdisk/arhivy/'Архив баз 1С - 8.1 -`date`.tar.gz' /home/SharedFolder/1C_Bases/8.1/*
tar -czvf /media/usbdisk/arhivy/'Архив баз 1С - 8.2 -`date`.tar.gz' /home/SharedFolder/1C_Bases/8.x/*


Написал следующее

Код

#!/bin/sh

SRC="/home/SharedFolder/1C_Bases/7.7"
DST="/media/usbdisk/arhivy"
APP="1C_DBs_7.7"
D="`date`"
EXT="tar.gz"
TRG_NAME="${DST}/${APP}_${D}.${EXT}"
## двойные ковычки дают использовать и пробелы в именах, но это изначально дурной тон
tar -czvf "${TRG_NAME}" "${SRC}"/*

SRC="/home/SharedFolder/1C_Bases/8.1"
DST="/media/usbdisk/arhivy"
APP="1C_DBs_8.1"
D="`date`"
EXT="tar.gz"
TRG_NAME="${DST}/${APP}_${D}.${EXT}"
## двойные ковычки дают использовать и пробелы в именах, но это изначально дурной тон
tar -czvf "${TRG_NAME}" "${SRC}"/*

SRC="/home/SharedFolder/1C_Bases/8.x"
DST="/media/usbdisk/arhivy"
APP="1C_DBs_8.x"
D="`date`"
EXT="tar.gz"
TRG_NAME="${DST}/${APP}_${D}.${EXT}"
## двойные ковычки дают использовать и пробелы в именах, но это изначально дурной тон
tar -czvf "${TRG_NAME}" "${SRC}"/*


Всё работает.
Всем спасибо!

bilbobagginz, тебе особенно!
smile

Автор: bilbobagginz 10.11.2011, 19:43
может код повторять не надо, все-таки одно и тоже делаешь 3 раза:
Код

#!/bin/sh
### повторяемый код надо в цикл. 
### потом добавить версию 9.1 - как 2 пальца об асфальт.
VERSIONS="
7.7
8.1
8.x
"
SRC_ROOT="/home/SharedFolder/1C_Bases/"
DST_ROOT="/media/usbdisk/arhivy"
APP_PREFIX="1C_DBs"
DATE="`date`"
EXT="tar.gz"
BACKUP_CMD="tar -zcf"
ERRORS="/var/log/backup.errors.${DATE}"

for V in ${VERSIONS}
do
    DST="${DST_ROOT}/${APP_PREFIX}_${V}_${DATE}.${EXT}"
    SRC="${SRC_ROOT}/${V}"
    ${BACKUP_CMD} "${DST}" "${SRC}"/* 2>&1 >> ${ERRORS}
    # так проверяют результат посл. программы:
    if [ $? -ne 0 ]; then
    # 0 - хорошо, не 0 - плохо, т.е. ошибка
        echo "ERROR: [${DATE}] Failed to backup folder: ${SRC}" >> "${ERRORS}"
    fi
done


Автор: mihanik 10.11.2011, 20:04
Цитата(bilbobagginz @  10.11.2011,  19:43 Найти цитируемый пост)
может код повторять не надо, все-таки одно и тоже делаешь 3 раза:


Гы...

А это я немного поиздевался...

 smile  smile  smile 

Автор: rsm 11.11.2011, 18:10
Цитата(newbee @  9.11.2011,  20:07 Найти цитируемый пост)
нагляднее делать $(expr)

Не портабельно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)