Есть набор программ и скриптов. Нужно чтобы они запускались как команды из любого места. Если в /etc/.profile указать - получается. Но я подумал, что указав в ~/.profile я сделаю для своего пользователя возможность такого запуска, а для остальных нет. Ан нет. Из домашнего профиля почему-то не работает. А почему?
PATH в /etc/.profile и ~/.profile?
~/.bash_profile, ~/.bash_login и ~/.profile -- первый из них выполняется, если bash
запускается как login shell (man bash). По крайней мере я так понял из
When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.
~/.bashrc выполняется при запуске интерактивного shell-а.
Со всеми этими сшелами не особо понял, но добавив путь с PATH в ~/bashrc вместо ~/.profile получил желаемый результат. Видимо мой случай. При этом root не находит эти команды, думаю как и все остальные. Спасибо!
Поясню: после чтения /etc/profile ищется и исполняется первый существующий и доступный по чтению из ~/.bash_profile, ~/.bash_login, ~/.profile.
Это как раз ясно. Я про варианты консолей. Интерактивные и пр. Если не вдаваться в подробности, то буду считать, что для запуска из gnome-terminal будет использоваться указанная вами последовательность конфигурационных файлов.
Теперь возникла проблема в crontab, видимо как раз с переменными окружения. Т.е. запускаю скрипт из консоли - работает, а если в кроне его запустить - нет. Как объявить переменную для скрипта, запускаемого из крона. В ~/bashrc не работает, в ~/.profile и ~/.bash_profile тоже. ~/.bash_login не стал уже пробовать. Проверяю задачей "type $PATH"
Теперь возникла проблема в crontab, видимо как раз с переменными окружения. Т.е. запускаю скрипт из консоли - работает, а если в кроне его запустить - нет. Как объявить переменную для скрипта, запускаемого из крона. В ~/bashrc не работает, в ~/.profile и ~/.bash_profile тоже. ~/.bash_login не стал уже пробовать. Проверяю задачей "type $PATH"
Не работает, т.к. эти файлы не анализируются при выполнении скрипта, запускаемого
cron'ом. Они не имеют к нему абсолютно никакого отношения. Определяйте
необходимые переменные в самом скрипте.
Пётр.
как вариант это написать так: /bin/sh /путь_до_скрипта/my_script.sh > /dev/null 2>&1
Я попробовал в /var/spool/cron/crontab/username прописать переменные и в /etc/crontab - никак.
Получилось действительно, если прописать переменные внутри скрипта. В принципе устроит. Там скрипты запускают ещё скрипты, но при указании в первом всё пока работает.
как вариант это написать так: /bin/sh /путь_до_скрипта/my_script.sh > /dev/null 2>&1
Нет, как то он вообще ничего не выдал и закончился.
NordWest, ну можете вывод в файл перенаправить, в чем проблема то? oO
Я попробовал в /var/spool/cron/crontab/username прописать переменные и в /etc/crontab - никак.
Получилось действительно, если прописать переменные внутри скрипта. В принципе устроит. Там скрипты запускают ещё скрипты, но при указании в первом всё пока работает.
1. [console]user$ crontab -e[/console]
2. в скрипте
#!/bin/sh
export HOME=/home/user
source $HOME/.bashrc> /dev/null 2>&1
А вот эта конструкция что собственно делает? Мне вывод в файл то не надо. Не понимаю как это связано с переменными среды.
что собственно делает?
ответ:
Мне вывод в файл то не надо.
ответ:
Ну да, стандартный поток вывода в null, а что-то там, видимо поток stderr, в stdout. Вместо обычного выполнения я увижу только сообщения об ошибках. Наверное должен буду увидеть сообщения о не найденной команде, которая в PATH есть. Ладно, когда-нибудь пригодится.
Ну да, стандартный поток вывода в null, а что-то там, видимо поток stderr, в stdout. Вместо обычного выполнения я увижу только сообщения об ошибках. Наверное должен буду увидеть сообщения о не найденной команде, которая в PATH есть. Ладно, когда-нибудь пригодится.
не так.
а) стандартный поток отправляется в /dev/null (в никуда)
б) поток ошибок отправляется в стандартный поток.
несмотря на то, что пункт (а) левее, эффект одинаковый. Получается так:
поток ошибок отправляется в стандартный поток, который направлен в никуда.
потому вы ничего вообще не увидите.
Попробуйте, если не верите.
i2ks, хороший пример тонкостей работы с потоками... Правда вас не поняли. Но плюсую.
2. в скрипте
#!/bin/sh
export HOME=/home/user
source $HOME/.bashrc
Кстати, такой вариант пока не прошел. Работает когда явно задать переменные, а так почему-то только половина скриптов находит себя. Не знаю почему, пока работающую версию буду использовать, а с этой может ещё поэкспериментирую. И я вот пишу "#!/bin/bash", это существенно?
И я вот пишу "#!/bin/bash", это существенно?
нет,потому что sh ссылается на bash
~> ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Мар 24 18:08 /bin/sh -> bash
Кстати, такой вариант пока не прошел. Работает когда явно задать переменные, а так почему-то только половина скриптов находит себя.
какие переменные?
что значит "находит себя"?
непонятно...
#!/bin/sh # в данном случае это не нужно, в силу того, что (насколько я знаю) всегда
# этот скрипт выполняется командой source.
export HOME=/home/user
source $HOME/.bashrc # команда source вовсе не выполняет скрипт, а _включает_ его внутрь родительского скрипта
# так, как будто мы скопипастили сюда содержимое .bashrc
нет,потому что sh ссылается на bash
уважаемый модатор, это "Кросс-дистрибутивные вопросы", а не вопросы о Вашей ОС.
вы полагаете, что ВО ВСЕХ линуксах есть bash? :o
какие переменные?
что значит "находит себя"?
непонятно...
Да там сложная схема: скрипты1 -> программа -> скрипты2.
# команда source вовсе не выполняет скрипт, а _включает_ его внутрь родительского скрипта
# так, как будто мы скопипастили сюда содержимое .bashrc
Да, по идее разницы быть не должно, но от чего то она есть. Надо будет поэкспериментировать...
Да там сложная схема: скрипты1 -> программа -> скрипты2.
а в Linux'е всегда так. Привыкайте.
Да, по идее разницы быть не должно, но от чего то она есть. Надо будет поэкспериментировать...
разница огромная!
скрипт1 -> скрипт2 -> скрипт3
т.е. первый скрипт вызывает второй, а тот, в свою очередь третий.
Например в скрипте №2 мы напишем
X=17внутри скрипта №2
echo $X выдаст 17. Но ни в скрипте №1, ни в №3 переменная X существовать НЕ будет.
мама не может влиять ни на бабушку, ни на дочку.
Однако, если в скрипте №2 мы напишем
export X=17то это повлияет на скрипт №3, т.е. мама имеет (при желании) власть над своей дочкой. Но навязать своё мнение бабушке она никогда не сможет. Такие дела.
Если мы напишем в скрипте №1
source скрипт2то всё изменится: В этом случае скрипт №1 и скрипт №2 станут единым целым, точно так-же, как если-бы мы просто вставили в скрипт№1 содержимое №2.
Естественно, в этом случае, переменные из №2 видны и в №1. А экспортированные и в №3.
Если это бинарник, а не скрипт, то всё остаётся также, за исключением того, что мы очевидно не сможем вставить в скрипт бинарник:
[console]# source /bin/true
-su: source: /bin/true: не могу запустить бинарный файл
[/console]
ЗЫЖ экспериментировать конечно надо, но только ПОСЛЕ прочтения документации.