LINUX.ORG.RU

Сообщения Kukuster

 

Проверка соответствия строки требованиям пути в FS Linux и Windows

Форум — Admin

Пишу скрипт на bash, нужно проверять переменную на соответствия требованиям пути в фс как в линуксе, так и в винде.
Нужно в обеих, потому что, например, в линуксе можно создавать файлы с двоеточием в названии или с одними пробелами, а винда такие файлы читать не может. Да чего уж там, в линуксе можно создать файл с символами переноса строки, или вообще с пустым названием. Такие файлы не то что access, их удалить можно только удалением папки, в которой они находятся, не говоря уже о том, что можно вытварять с запросами на такие файлы.
Я так понял, linux - ОС неограниченных возможностей, но ведь есть же какие-то требования адекватности названий файлов и папок для вменяемой работы с этими файлами и папками?

Нужно предотвратить указание неадекватного пути, которое может быть неправильно понято линуксом и виндой, и при существовании которого линукс и винда могут неадекватно работь с таким файлом/папкой.
Ну я так понял можно использовать alphanumeral chars, нижнее подчеркивание, дефис, скобочки, тильду (в некоторых темперальниках и в винде и в линуксе видел), пробелы (но не одни пробелы), точки (но не одни точки).
1. Есть еще что-то, что я не учел? Может какие-то символы еще нужны?
2. Как это реализовать программно?

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

function read_path() {
    path=""
    path_correct=false
    path_cancel=false
    while [[ $path_correct = false ]] && [[ $path_cancel = false]]; do
        echo "Enter path:"
        read path
        if [[ "$path" == "cancel" ]]; then
            path_cancel=true
        elif [[ "$path" == [^/]* ]]; then
            echo "you should specify full absolute path that starts with slash \"/\""
        elif [[ "$path" == */ ]]; then
            echo "please dont use slash \"/\" at the end of path"
        elif [[ вот тут проверка ]]; then
            echo "perfect, the path is ok, please proceed"
            path_correct=true
        else
            echo "the path has some unallowed symbols"
        fi
    done
}

Для проверки я пробовал такие проверки:
[[ ! "$path" == *['!'@#\$%^\&*+]* ]]
[[ "$path" == [a-zA-z0-9_.\(\)~\/-]* ]]
[[ "$path" =~ ^[a-zA-z0-9_\ -]+$ ]]
Ничего из этого не работает так, как надо.

 ,

Kukuster
()

Как со строки считать слова в ковычках? bash

Форум — Admin

Считывание слов со строки, которые разделены пробелом(ами)/эндлайном/табулятором это легко.
А как при этом считывать отдельно еще и «слова», которые могут содержать пробелы, и которые определены кавычками? Обычные ковычки. Просто если в скрипте именно так и считывать, то оно игнорирует и ковычки и escape-символ \ и т.д., и в результате если видит хотябы один пробел или эндлайн, то воспринимает как отдельное слово.
Т.е. нужно чтобы считывало как bash считывает аргументы функций.

При этом в скрипте через функцию почему-то не получается:

keywords_test="allsecurityinfo                     \"/media/kukubuntu/Data/AAA_Work/Programing/WEB/allsecurity.info\"
ubuntu_program_files                \"/media/kukubuntu/Data/Program Files/AAA_Ubuntu\""

function readkeywords() {
    echo "\$1 = $1"
    echo "\$2 = $2"
    echo "\$3 = $3"
    echo "\$4 = $4"
    echo "\$5 = $5"
    echo "\$6 = $6"
}

readkeywords $keywords_test
exit 0

выдаёт:

$1 = allsecurityinfo
$2 = "/media/kukubuntu/Data/AAA_Work/Programing/WEB/allsecurity.info"
$3 = ubuntu_program_files
$4 = "/media/kukubuntu/Data/Program
$5 = Files/AAA_Ubuntu"
$6 = 

В принципе можно написать програмку всякими этими рэгэкспами, но может быть можно реализовать как-нибудь по-простому?

 , , , ,

Kukuster
()

Что означает «exec» перед командой bash?

Форум — Admin

Я читал про перенаправление потоков с пом. exec, вроде-бы понимаю смысл, вроде-бы понимаю как это работает, но видимо только методично. Например в bash скриптах я встречал использование echo просто так:

echo text
и так:
exec echo text
В чем отличие? Зачем «exec»?
В чем будет отличие если я буду, например, вызывать интерпритатор питона, mount’ить фс, запускать какой-то демон или какой-то foreground процесс используюя «exec» и нет?
Я вот разницу заметил только используя
exec apt-get update
в юбунте сразу после ввода которого терминал просто закрылся, а список пакетов так и не обновился. После такого мне больше не захотелось всюду пробовать exec.

 

Kukuster
()

Установка pyenv и стеснительный bash

Форум — Development

Здравствуйте.
Я бегу Ubuntu 14.04 LTS.
Хочу иметь возможность содержать много разных питонов у себя на несистемном ntfs-разделе (называется Data). На сколько я понимаю, проблему удобства манипуляции проектами на python решает virtualenv и virtualenvwrapper. Также они дают возможность удобно хранить это всё как раз на несистемном диске, да и вообще, где угодно. Задачу установки питона любой пароды и версии где угодно — решает pyenv.
В чём собсвтенно проблема: после установки pyenv на мою Data, при попытке оболочкой исполнить бинайрный файл pyenv bash говорит, что у него нет прав на это.
Перед тем как сюда писать, я достаточно много порылся в инете, особенно на stackoverflow.com (на рунет я вообще забил). Но потом, мне посоветовали написать сюда.
В чём собственно задача: возможность содержать питонистый lamp со всеми проектами у себя на несистемном разделе; чтобы всё файлы непосредственно продукта, который я разрабатываю, хранились на несистемном разделе, и минимизировать настройку доступа программами к этим файлам при переустановке Ubuntu.

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

1. Устанавливаю свежую Ubuntu 14.04 LTS
2. Подключаю свой раздел Data через рута с масками 0000 для файлов и для директорий

( читать дальше... )


3. Устанавливаю пакет python-pip

( читать дальше... )


4. Устанавливаю с пом. него virtualenvwrapper

( читать дальше... )


5. Настраиваю virtualenvwrapper в файле .bashrc

( читать дальше... )


6. Устанавливаю git и необходимые для него пакеты

( читать дальше... )


7. Устанавливаю pyenv на Data

( читать дальше... )


8. Настраиваю pyenv в .bashrc

( читать дальше... )


9. Добавляю путь к ".pyenv/bin/" в переменную $PATH

( читать дальше... )


10. Перелогинился (где-то прочитал что это необходимо после настройки .profile и $PATH)
11. bash всёравно думает, что у него нет прав

( читать дальше... )


Что за дела? Я чего-то не сделал или где-то допустил ошибку? Или может мою задачу можно удобно решить и без pyenv?

 , ,

Kukuster
()

RSS подписка на новые темы