LINUX.ORG.RU

Почему не работает команда в BASH скрипте?


0

2

Здравствуйте!

Есть у меня BASH-скрипт. В нем в частности есть такие строки:

 # Формируется команда монтирования
 CMD="/bin/mount /dev/$1 ${DIRNAME} -t ${FSYS} -o ${OPTION} && /bin/echo /dev/$1 ${DIRNAME} ${FSYS}
 echo "CMD: ${CMD}" >> ${LOG}
 echo "CMD: ${CMD}"

 # Выполняется команда монтирования
 ${CMD}

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

Однако, эта команда (содержащая mount) не срабатывает, монтирование не происходит, выдается сообщение о том, какие опции команды mount есть:

# ./media_mount sdc1 mount
CMD: /bin/mount /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE -t ntfs-3g -o defaults,iocharset=utf8,umask=007,gid=46,force && /bin/echo /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE ntfs-3g defaults,iocharset=utf8,umask=007,gid=46,force 0 0 >> /etc/fstab
Usage: mount -V                 : print version
       mount -h                 : print this help
       mount                    : list mounted filesystems
       mount -l                 : idem, including volume labels
So far the informational part. Next the mounting.
The command is `mount [-t fstype] something somewhere'.
Details found in /etc/fstab may be omitted.
       mount -a [-t|-O] ...     : mount all stuff from /etc/fstab
       mount device             : mount device at the known place
       mount directory          : mount known device here
       mount -t type dev dir    : ordinary mount command
Note that one does not really mount a device, one mounts
a filesystem (of the given type) found on the device.
One can also mount an already visible directory tree elsewhere:
       mount --bind olddir newdir
or move a subtree:
       mount --move olddir newdir
One can change the type of mount containing the directory dir:
       mount --make-shared dir
       mount --make-slave dir
       mount --make-private dir
       mount --make-unbindable dir
One can change the type of all the mounts in a mount subtree
containing the directory dir:
       mount --make-rshared dir
       mount --make-rslave dir
       mount --make-rprivate dir
       mount --make-runbindable dir
A device can be given by name, say /dev/hda1 or /dev/cdrom,
or by label, using  -L label  or by uuid, using  -U uuid .
Other options: [-nfFrsvw] [-o options] [-p passwdfd].
For many more details, say  man 8 mount .

Я копирую команду, которая была выведена на экран:

/bin/mount /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE -t ntfs-3g -o defaults,iocharset=utf8,umask=007,gid=46,force && /bin/echo /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE ntfs-3g defaults,iocharset=utf8,umask=007,gid=46,force 0 0 >> /etc/fstab

выполняю её в консоли под рутом, и она выполняется без ошибок! Никаких сообщений об опциях команды mount не выводится, монтирование срабатывает как нужно.

Вопрос. Почему такое безобразие происходит??? Как побороть?


Ответ на: комментарий от sdio

> eval $CMD

Так работает.

Объясните мне. почему не работает ${CMD}? Я целый день потратил, пока эту гадость не заметил.

xintrea
() автор топика
Ответ на: комментарий от sdio

> eval $CMD

Хотя нет, я поторопился. Работает не до конца.

Работает правильно, если вызывать скрипт в консоли. Я обрадовался.

Однако не работает, если этот скрипт вызывается из UDEV. Причем я логирую переданные скрипту параметры. Запускаю из консоли с этими параметрами - работает. А из UDEV - не работает.

В чем может быть проблема?

xintrea
() автор топика
Ответ на: комментарий от xintrea

> А из UDEV - не работает.

То есть работает, но ведет себя так же, как запускаемый скрипт с ${CMD} из стартовой мессаги.

xintrea
() автор топика
Ответ на: комментарий от sdio

> eval $CMD

Я уже попробовал варианты:

eval $CMD
eval «$CMD»
eval ${CMD}
eval «${CMD}»
bash -c $CMD
bash -c «$CMD»
bash -c ${CMD}
bash -c «${CMD}»

- работает в консоли, но с теми же параметрами не работает из UDEV.

xintrea
() автор топика

>CMD=«/bin/mount /dev/$1 ${DIRNAME} -t ${FSYS} -o ${OPTION} && /bin/echo /dev/$1 ${DIRNAME} ${FSYS}

Нет закрывающей кавычки. Или это опечатка?

Heretique
()
Ответ на: комментарий от Heretique

CMD=«/bin/mount /dev/$1 ${DIRNAME} -t ${FSYS} -o ${OPTION} && /bin/echo /dev/$1 ${DIRNAME} ${FSYS}

Нет закрывающей кавычки. Или это опечатка?

Это я с экрана скопировал, не заметил что не полностью. Команда дальше за экран продолжается.

Выглядит так:

 # Формируется команда монтирования
 CMD="/bin/mount /dev/$1 ${DIRNAME} -t ${FSYS} -o ${OPTION} && /bin/echo /dev/$1 ${DIRNAME} ${FSYS} ${OPTION} 0 0 >> /etc/fstab"
 echo "CMD: ${CMD}" >> ${LOG}
 echo "CMD: ${CMD}"

 # Выполняется команда монтирования
 eval $CMD
xintrea
() автор топика
Ответ на: комментарий от Heretique

Блин, я уже второй день это монтирование делаю. То одна гадость вылезет, то другая. Я уже спать хочу! Я устал!

Скажите уже, как наверняка выполнить сформированную команду. Чтобы она тупо выполнилась. Без выкрутасов, так же как и в консоли. Просто выполнилась команда, я не хочу ничего большего!

xintrea
() автор топика
Ответ на: комментарий от xintrea

На поставленный вопрос ты ответ получил.

В твоем сообщении нет ни одного скрипта (скрипт начинается с #!/bin/$SHELL)

sdio ★★★★★
()
Ответ на: комментарий от sdio

> В твоем сообщении нет ни одного скрипта (скрипт начинается с #!/bin/$SHELL)

Я ж не полный скрипт показываю, а пару строк в середине, на которых проблема возникает.

Полный скрипт выглядит так:

http://paste.org.ru/?sgf9xs

xintrea
() автор топика
Ответ на: комментарий от sdio

Я отмонтирую флешку, выдергиваю её, проверяю чтоб ни в выводе mount, ни в fstab никаких упоминаний о ней небыло. Потом втыкаю её. При автомонтировании через UDEV, в лог попадают сообщения:

-----
Run media_mount with [sdc1] [mount]
whoami: root
pwd: /
FSTYPE: ntfs
DIRNAME: /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE
FSYS: ntfs-3g
OPTION: defaults,iocharset=utf8,umask=007,gid=46,force
CMD: /bin/mount /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE -t ntfs-3g -o defaults,iocharset=utf8,umask=007,gid=46,force && /bin/echo  /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE ntfs-3g defaults,iocharset=utf8,umask=007,gid=46,force 0 0 >> /etc/fstab

И флешка монтируется с ошибками.

Я отмонтирую, проверяю чтоб ни в выводе mount, ни в fstab никаких упоминаний небыло. Не вытаскиваю флешку, чтоб при вставке не сработал UDEV. А просто запускаю скопированную из лога команду:

/bin/mount /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE -t ntfs-3g -o defaults,iocharset=utf8,umask=007,gid=46,force && /bin/echo  /dev/sdc1 /media/usb/FreeAgent_Drive_048C1A2B8C1A17AE ntfs-3g defaults,iocharset=utf8,umask=007,gid=46,force 0 0 >> /etc/fstab

в консоле под рутом. И монтирование происходит правильно!

Не могу понять, почему так происходит. Команда одна и таже. Результат разный.

xintrea
() автор топика
Ответ на: комментарий от silw

> мб не хватает каких-то переменных окружения?

Так, добавил логирование команды export в скрипт.

В скрипте, выполняемом из UDEV, переменные такие:
http://paste.org.ru/?wo16mq

В скрипте, выполняемом в консоли из-под рута, переменные такие:
http://paste.org.ru/?fyg1cj

При сравнении видно, что набор переменных различается, причем достаточно сильно.


Вопрос. Как сделать окружение, вызываемое из UDEV таким же, как и окружение в консоли рута?

xintrea
() автор топика
Ответ на: комментарий от xintrea

повставлять в свой скрипт монтирования кучу «export» ? или «env». Но проблема может и не в этом, просто у нас было нечто подобное, когда из крона вызывали одну софтинку, долго ничего не получалось, пока не привели в норму переменные окружения.

silw ★★★★★
()
Ответ на: комментарий от sdio

Упрощу задачу экспертам, подытожу.

При запуске в консоли, есть например такие переменные:

SHELL=«/bin/bash»
TERM=«xterm»
USER=«root»

А при запуске из UDEV этих переменных нет.

И еще в консоли есть переменная SHLVL=«5», а в UDEV она равна SHLVL=«1».

Очем всё это говорит? Как засунуть нужные рутовые переменные в запуск скрипта из-под UDEV? И нужно ли это вообще делать?

xintrea
() автор топика
Ответ на: комментарий от silw

> повставлять в свой скрипт монтирования кучу «export» ? или «env»

???

Это же не решение проблемы, а неслабый такой костыль. Еслиб ты сказал, как вытянуть переменные окружения из окружения консоли рута, это было бы другое дело.

xintrea
() автор топика
Ответ на: комментарий от sdio

И вообще мне кажется, что скрипт, запускаемый из-под UDEV, выполняется не в шелле, а просто напрямую в интерпретаторе. Так ли это?

Хотя, SHLVL=«1» говорит о том, что шелл таки есть. Хотя я в этом не разбираюсь.

xintrea
() автор топика
Ответ на: комментарий от xintrea

в смысле костыль? а как ты еще получишь эти переменные в другом окружении, кроме как экспортировав их сам?

silw ★★★★★
()
Ответ на: комментарий от silw

> в смысле костыль? а как ты еще получишь эти переменные в другом окружении, кроме как экспортировав их сам?

Ок, щас я попробую засунуть весь выхлоп export в скрипт.

Если не поможет, значит какая-то проблема в интерпретаторе.

xintrea
() автор топика

Не пойму только зачем ты мучаешь Му-му с формированием $CMD?

Сделай запись в fstab со всеми параметрами, а потом просто /bin/mount $MOUNTPOINT

sdio ★★★★★
()
Ответ на: комментарий от sdio

> Не пойму только зачем ты мучаешь Му-му с формированием $CMD?

Потому что это классическая техника любого интерпретируемого языка. Если нужно отладиться, формируешь команду, логируешь её, и выполняешь. Какого хрена такие извратные залипухи в лялихе, понять не могу.

xintrea
() автор топика

А тот скрипт, который я вчера давал, который без потугов на красивое программирование в шелле, он не работает?

Lumi ★★★★★
()
Ответ на: комментарий от sdio

> Не пойму только зачем ты мучаешь Му-му с формированием $CMD?

Сделай запись в fstab со всеми параметрами, а потом просто /bin/mount $MOUNTPOINT


Это не решение. Рано или поздно возникнет такая ситуация, что нужно сформировать команду из кусочков и выполнить её. Как ты будешь это делать, если до сих пор не знаешь?

xintrea
() автор топика
Ответ на: комментарий от sdio

> Сделай запись в fstab со всеми параметрами, а потом просто /bin/mount $MOUNTPOINT

Идея с этой записью состоит в том, что она нужна только для того, чтобы можно было флешку отмонтировать потом обычным пользователем. То есть в fstab нужно писать всё-таки после успешного монтирования. Если не смонтировалось, то и запись не нужна.

Lumi ★★★★★
()
Ответ на: комментарий от Lumi

> А тот скрипт, который я вчера давал, который без потугов на красивое программирование в шелле, он не работает?

Да, не работает. Монтировать-то монтирует, но криво. После монтирования не показывает файлы, в которых есть русские буквы.

А я ради этого то весь сыр-бор и начал.

xintrea
() автор топика
Ответ на: комментарий от xintrea

> Как ты будешь это делать, если до сих пор не знаешь?

echo «${CMD}» | /bin/bash

Lumi ★★★★★
()
Ответ на: комментарий от xintrea

> После монтирования не показывает файлы, в которых есть русские буквы.

Так надо было параметры у mount покрутить в скрипте.

Lumi ★★★★★
()
Ответ на: комментарий от xintrea

xintrea> что нужно сформировать команду из кусочков и выполнить её. Как ты будешь это делать, если до сих пор не знаешь?

CMD=/bin/mount
DEV=/dev/sda1
MOUNTPOINT=/mnt/usb/blah-blah
OPTIONS='rw,...'
FSTYPE='vfat'
PARAMS="-o $OPTIONS -t $FSTYPE'

Исполнение
$CMD $DEV $MOUNTPOINT $PARAMS && echo «$DEV $MOUNTPOINT $FSTYPE $OPTIONS 0 0» >> $FSTAB

sdio ★★★★★
()
Ответ на: комментарий от xintrea

Воткнул у себя флешку с vfat

$ ls -l /media/374C-0333/
итого 3047196
-rw-rw-rw- 1 root root 3116206080 Дек 5 15:37 Nachalo.2010.DUAL.BDRip.XviD.AC3.-HQCLUB.avi
-rw-rw-rw- 1 root root 1109527 Ноя 12 21:17 postgresql.pdf
-rw-rw-rw- 1 root root 3008211 Ноя 19 16:02 Бог как иллюзия.pdf

Могу сейчас переформатировать в ntfs и ext2. Но, уверен, ничего не изменится.

Скрипт такой:


#!/bin/bash

FSTYPE=$(/sbin/blkid -o udev /dev/${1} | /usr/bin/awk -F= '/ID_FS_TYPE/ { print $2 }')
DIRNAME=$(/sbin/blkid -o udev /dev/${1} | /usr/bin/awk -F= '/ID_FS_UUID_ENC/ { print $2 }')

if [ «x${DIRNAME}» == «x» ]; then DIRNAME=usbdrive-${1}; fi

if [ «x$2» == «xmount» ]; then
case ${FSTYPE} in
vfat)
   /bin/mkdir «/media/${DIRNAME}»
   /bin/mount /dev/$1 «/media/${DIRNAME}» -t vfat -o shortname=lower,iocharset=utf8,noatime,users,dmask=000,fmask=111 && \
   /bin/echo /dev/$1 «/media/${DIRNAME}» vfat shortname=lower,iocharset=utf8,noatime,users,dmask=000,fmask=111 0 0 >> /etc/fstab
;;

ntfs)
/bin/mkdir «/media/${DIRNAME}»
/bin/mount /dev/$1 «/media/${DIRNAME}» -t ntfs-3g && \
/bin/echo /dev/$1 «/media/${DIRNAME}» ntfs-3g relatime,users,dmask=000,fmask=111 0 0 >> /etc/fstab
;;

*)
/bin/mkdir «/media/${DIRNAME}»
/bin/mount /dev/$1 «/media/${DIRNAME}» -t auto -o users && \
/bin/echo /dev/$1 «/media/${DIRNAME}» auto users 0 0 >> /etc/fstab
;;
esac
else
   /bin/umount -l /dev/${1}
   /bin/rmdir $(/usr/bin/awk «/${1}/ { print \$2 }» < /etc/fstab)
   /bin/sed «/\/dev\/${1}/d» -i /etc/fstab
fi

Хотя мне очень не нравится, что в нём есть awk, так как awk лежит в /usr/bin. Да и удаление из fstab надо переписать в более безопасном варианте.

Lumi ★★★★★
()
Ответ на: комментарий от Lumi

> Так надо было параметры у mount покрутить в скрипте.

Ты думаешь, я не крутил? Кстати, у тебя параметры в скрипте изначально нормальные. С ними из-под рута монтируется так, что русские файлы видны. А в UDEV с этими же параметрами - нет. Можешь сам проверить и будешь удивлён.

Поэтому я и сделал конструирование команды, чтоб отладить её и понять что к чему.

xintrea
() автор топика
Ответ на: комментарий от sdio

> Исполнение

$CMD $DEV $MOUNTPOINT $PARAMS && echo «$DEV $MOUNTPOINT $FSTYPE $OPTIONS 0 0» >> $FSTAB


Вот и у меня изначально так было:

/bin/mount /dev/$1 «/media/${DIRNAME}» -t ntfs-3g && \
/bin/echo /dev/$1 «/media/${DIRNAME}» ntfs-3g defaults,iocharset=utf8,users,dmask=000,fmask=111 0 0 >> /etc/fstab

И в таком виде монтируется криво - файлов с русскими символами в именах не видно.

Я щас вернул к этому виду, избавился от $CMD - та же песня. В консоли правильно монируется, в UDEV - неправильно.

xintrea
() автор топика
Ответ на: комментарий от xintrea

> Кстати, у тебя параметры в скрипте изначально нормальные.

Хотя нет, у тебя для NTFS неправильные опции. Я почему-то думал, что ты писал

1. defaults,iocharset=utf8,users,dmask=000,fmask=111

а у тебя

2. relatime,users,dmask=000,fmask=111

Но это к делу не относится, потому что и при опциях 1 и при опциях 2, после монтирования через UDEV, русские файлы не видно.

xintrea
() автор топика
Ответ на: комментарий от xintrea

Такое только с ntfs?
На флешках с vfat и ext2 русские названия файлов корректные?
Или везде проблемы?

У меня на vfat проблем нет, сейчас попробую на ntfs (надо было раздел на флешке маленький делать, а то восемь гигов медленно очень).

Lumi ★★★★★
()
Ответ на: комментарий от xintrea

xintrea> И в таком виде монтируется криво - файлов с русскими символами в именах не видно.

После монтирования команда mount показывает все эти параметры iocharset=utf8,... ?

sdio ★★★★★
()
Ответ на: комментарий от xintrea

> Но это к делу не относится

Да, не относится. Потому что можно руками подмонтировать, посмотреть командой mount опции, с которыми примонтировалось и вписать их в скрипт.

Lumi ★★★★★
()
Ответ на: комментарий от sdio

Алилуйя, нашел!

1. eval «$CMD» - делает все правильно, так что команду можно конструировать в строку, и она будет правильно выполнена через eval.

2. Проблема была в том, что в начале скрипта надо было добавить одну-единственную строчку:

declare -x LANG=«ru_RU.UTF-8»

После этого монтирование через UDEV начинает работать правильно, файлы с именами на русском языке становятся видны.

xintrea
() автор топика
Ответ на: комментарий от xintrea

ls -l /media/*
/media/0B9D98EB55B9C803:
итого 2940
-rwxrwxrwx 1 root root 3008211 Ноя 19 16:02 Бог как иллюзия.pdf

/media/47a516d3-4dcd-4a7d-8adf-aa19e5b35ab5:
итого 2963
drwx------ 2 root root 12288 Дек 11 23:16 lost+found
-rw-rw-rw- 1 root root 3008211 Ноя 19 16:02 Бог как иллюзия.pdf

/media/C431-0098:
итого 2940
-rw-rw-rw- 1 root root 3008211 Ноя 19 16:02 Бог как иллюзия.pdf


mount | grep media
/dev/sde1 on /media/0B9D98EB55B9C803 type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096)
/dev/sde3 on /media/C431-0098 type vfat (rw,noexec,nosuid,nodev,noatime,shortname=lower,iocharset=utf8,dmask=000,fmask=111)
/dev/sde2 on /media/47a516d3-4dcd-4a7d-8adf-aa19e5b35ab5 type ext2 (rw,noexec,nosuid,nodev)

Lumi ★★★★★
()
Ответ на: комментарий от xintrea

> declare -x LANG=«ru_RU.UTF-8»

Мда, примерно такой глупости и надо было ожидать.
Интересно, что у тебя показывает команда locale в скрипте, при вызове из udev?

Lumi ★★★★★
()
Ответ на: комментарий от Lumi

Видимо у тебя в окружении UDEV присутсвует переменная LANG=«ru_RU.UTF-8». Если несложно, проверь логированием. Так сказать, чтобы быть авбсолютно уверенным.

xintrea
() автор топика
Ответ на: комментарий от xintrea

LANG=
LC_CTYPE=«POSIX»
LC_NUMERIC=«POSIX»
LC_TIME=«POSIX»
LC_COLLATE=«POSIX»
LC_MONETARY=«POSIX»
LC_MESSAGES=«POSIX»
LC_PAPER=«POSIX»
LC_NAME=«POSIX»
LC_ADDRESS=«POSIX»
LC_TELEPHONE=«POSIX»
LC_MEASUREMENT=«POSIX»
LC_IDENTIFICATION=«POSIX»
LC_ALL=

Вот выхлоп locate при вызове скрипта. Тем не менее всё с русскими буквами в полном порядке. У меня ядро собрано с CONFIG_NLS_DEFAULT=«UTF8».

Lumi ★★★★★
()
Ответ на: комментарий от Lumi

> Интересно, что у тебя показывает команда locale в скрипте, при вызове из udev?

Ну что-то, конечно вот это:

LANG=
LC_CTYPE=«POSIX»
LC_NUMERIC=«POSIX»
LC_TIME=«POSIX»
LC_COLLATE=«POSIX»
LC_MONETARY=«POSIX»
LC_MESSAGES=«POSIX»
LC_PAPER=«POSIX»
LC_NAME=«POSIX»
LC_ADDRESS=«POSIX»
LC_TELEPHONE=«POSIX»
LC_MEASUREMENT=«POSIX»
LC_IDENTIFICATION=«POSIX»
LC_ALL=

xintrea
() автор топика
Ответ на: комментарий от Lumi

> Вот выхлоп locate при вызове скрипта. Тем не менее всё с русскими буквами в полном порядке. У меня ядро собрано с CONFIG_NLS_DEFAULT=«UTF8»

Выхлоп совпадает.

Ну значит, у меня ядро собиралось без CONFIG_NLS_DEFAULT=«UTF8». Как это проверить в Debian Lenny - не знаю.

xintrea
() автор топика
Ответ на: комментарий от xintrea

Теперь осталось сделать так, чтобы у тебя hal не монтировал флешки. Но, здесь я уже не помогу. Хал давно выпилил. Могу поддержать только теоретически и морально. :D

Lumi ★★★★★
()
Ответ на: комментарий от Lumi

> Теперь осталось сделать так, чтобы у тебя hal не монтировал флешки. Но, здесь я уже не помогу. Хал давно выпилил. Могу поддержать только теоретически и морально. :D

Да тут еще пилить и пилить.

Выяснилось, что твое решение монтировать через UDEV обладает одним недостатком. Неясно, как пользователю отмонтировать устройства. Ну, то есть, при работе через HAL, KDE и GNOME создают ярлычек устройства, которое можно «безопасно извлечь». При самодельном монтировании через UDEV, такого поведения, естественно, не наблюдается.

Я пользователю не объясню, как давать команды umount. И не могу создать ярлык на скриптик «umount /dev/sdb1», потому что иногда, при втыкании в одно и то же гнездо, диск определяется то как /dev/sdb1, то как /dev/sdc1, если долго комп не выключать, или воткнуть последоватеьно то одну, то другую флешку, можно увидеть и /dev/sdd1 и /dev/sde1. А на морде к тому же два USB-входа. Так что какие диски возможны, трудно себе представить.

То есть, сейчас можно только читать диски. А записывать на них невозможно, ибо изменения не сохраняются при вытаскивании.

xintrea
() автор топика
Ответ на: комментарий от xintrea

> Выяснилось, что твое решение монтировать через UDEV обладает одним недостатком. Неясно, как пользователю отмонтировать устройства. Ну, то есть, при работе через HAL, KDE и GNOME создают ярлычек устройства, которое можно «безопасно извлечь». При самодельном монтировании через UDEV, такого поведения, естественно, не наблюдается.

Слушай, у меня сейчас будет истерика, потому что у меня значок в гноме создаётся и при щелчке правой кнопкой по нему, при выборе пункта отмонтирования, происходит отмонтирование. Также работает монтирование/размонтирование в наутилусе в левой панели с устройствами. А знаешь почему? Потому что наутилус подхватывает точки монтирования именно из /media. Просто перестань выделываться и убери из скрипта отсебятину!

Lumi ★★★★★
()
Ответ на: комментарий от xintrea

Это твои (причём рукотворные) проблемы.
Монтировать сменные носители надо в /media
Гном действует в полном соответствии с FHS.
Тебе тоже следует придерживаться стандартов.
Если кеды не подхватят оттуда, значит выкинь кеды.

Lumi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.