LinuxForum.Fans
Тема

PATH в /etc/.profile и ~/.profile?

Автор: NordWest 30 сообщений 4768 просмотров
#174674

Есть набор программ и скриптов. Нужно чтобы они запускались как команды из любого места. Если в /etc/.profile указать - получается. Но я подумал, что указав в ~/.profile я сделаю для своего пользователя возможность такого запуска, а для остальных нет. Ан нет. Из домашнего профиля почему-то не работает. А почему?

#174676

~/.bash_profile, ~/.bash_login и ~/.profile -- первый из них выполняется, если bash
запускается как login shell (man bash). По крайней мере я так понял из

"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-а.

#174681

Со всеми этими сшелами не особо понял, но добавив путь с PATH в ~/bashrc вместо ~/.profile получил желаемый результат. Видимо мой случай. При этом root не находит эти команды, думаю как и все остальные. Спасибо!

#174692

Поясню: после чтения /etc/profile ищется и исполняется первый существующий и доступный по чтению из ~/.bash_profile, ~/.bash_login, ~/.profile.

#174724

Это как раз ясно. Я про варианты консолей. Интерактивные и пр. Если не вдаваться в подробности, то буду считать, что для запуска из gnome-terminal будет использоваться указанная вами последовательность конфигурационных файлов.

#178075

Теперь возникла проблема в crontab, видимо как раз с переменными окружения. Т.е. запускаю скрипт из консоли - работает, а если в кроне его запустить - нет. Как объявить переменную для скрипта, запускаемого из крона. В ~/bashrc не работает, в ~/.profile и ~/.bash_profile тоже. ~/.bash_login не стал уже пробовать. Проверяю задачей "type $PATH"

#178174
NordWest написал:
Теперь возникла проблема в crontab, видимо как раз с переменными окружения. Т.е. запускаю скрипт из консоли - работает, а если в кроне его запустить - нет. Как объявить переменную для скрипта, запускаемого из крона. В ~/bashrc не работает, в ~/.profile и ~/.bash_profile тоже. ~/.bash_login не стал уже пробовать. Проверяю задачей "type $PATH"

Не работает, т.к. эти файлы не анализируются при выполнении скрипта, запускаемого
cron'ом. Они не имеют к нему абсолютно никакого отношения. Определяйте
необходимые переменные в самом скрипте.

Пётр.

#178179

как вариант это написать так: /bin/sh /путь_до_скрипта/my_script.sh > /dev/null 2>&1

#178191

Я попробовал в /var/spool/cron/crontab/username прописать переменные и в /etc/crontab - никак.
Получилось действительно, если прописать переменные внутри скрипта. В принципе устроит. Там скрипты запускают ещё скрипты, но при указании в первом всё пока работает.

i2ks написал:
как вариант это написать так: /bin/sh /путь_до_скрипта/my_script.sh > /dev/null 2>&1

Нет, как то он вообще ничего не выдал и закончился.

#178201

NordWest, ну можете вывод в файл перенаправить, в чем проблема то? oO

#178244
NordWest написал:
Я попробовал в /var/spool/cron/crontab/username прописать переменные и в /etc/crontab - никак.
Получилось действительно, если прописать переменные внутри скрипта. В принципе устроит. Там скрипты запускают ещё скрипты, но при указании в первом всё пока работает.

1. [console]user$ crontab -e[/console]
2. в скрипте

text
#!/bin/sh
export HOME=/home/user
source $HOME/.bashrc
#178245
NordWest написал:
> /dev/null 2>&1

А вот эта конструкция что собственно делает? Мне вывод в файл то не надо. Не понимаю как это связано с переменными среды.

#178253
NordWest написал:
что собственно делает?

ответ:

NordWest написал:
Мне вывод в файл то не надо.
#178270
drBatty написал:
ответ:

Ну да, стандартный поток вывода в null, а что-то там, видимо поток stderr, в stdout. Вместо обычного выполнения я увижу только сообщения об ошибках. Наверное должен буду увидеть сообщения о не найденной команде, которая в PATH есть. Ладно, когда-нибудь пригодится.

#178434
NordWest написал:
Ну да, стандартный поток вывода в null, а что-то там, видимо поток stderr, в stdout. Вместо обычного выполнения я увижу только сообщения об ошибках. Наверное должен буду увидеть сообщения о не найденной команде, которая в PATH есть. Ладно, когда-нибудь пригодится.

не так.

а) стандартный поток отправляется в /dev/null (в никуда)
б) поток ошибок отправляется в стандартный поток.

несмотря на то, что пункт (а) левее, эффект одинаковый. Получается так:

поток ошибок отправляется в стандартный поток, который направлен в никуда.

потому вы ничего вообще не увидите.

Попробуйте, если не верите.

i2ks, хороший пример тонкостей работы с потоками... Правда вас не поняли. Но плюсую.

#178604
drBatty написал:
2. в скрипте

#!/bin/sh
export HOME=/home/user
source $HOME/.bashrc

Кстати, такой вариант пока не прошел. Работает когда явно задать переменные, а так почему-то только половина скриптов находит себя. Не знаю почему, пока работающую версию буду использовать, а с этой может ещё поэкспериментирую. И я вот пишу "#!/bin/bash", это существенно?

#178607
NordWest написал:
И я вот пишу "#!/bin/bash", это существенно?

нет,потому что sh ссылается на bash

text

~> ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Мар 24 18:08 /bin/sh -> bash
#179077
NordWest написал:
Кстати, такой вариант пока не прошел. Работает когда явно задать переменные, а так почему-то только половина скриптов находит себя.

какие переменные?
что значит "находит себя"?
непонятно...

text
#!/bin/sh # в данном случае это не нужно, в силу того, что (насколько я знаю) всегда 
# этот скрипт выполняется командой source.
export HOME=/home/user 
source $HOME/.bashrc # команда source вовсе не выполняет скрипт, а _включает_ его внутрь родительского скрипта
# так, как будто мы скопипастили сюда содержимое .bashrc
i2ks написал:
нет,потому что sh ссылается на bash

уважаемый модатор, это "Кросс-дистрибутивные вопросы", а не вопросы о Вашей ОС.
вы полагаете, что ВО ВСЕХ линуксах есть bash? :o

#179078
i2ks написал:
какие переменные?
что значит "находит себя"?
непонятно...

Да там сложная схема: скрипты1 -> программа -> скрипты2.

# команда source вовсе не выполняет скрипт, а _включает_ его внутрь родительского скрипта
# так, как будто мы скопипастили сюда содержимое .bashrc

Да, по идее разницы быть не должно, но от чего то она есть. Надо будет поэкспериментировать...

#179082
NordWest написал:
Да там сложная схема: скрипты1 -> программа -> скрипты2.

а в Linux'е всегда так. Привыкайте.

NordWest написал:
Да, по идее разницы быть не должно, но от чего то она есть. Надо будет поэкспериментировать...

разница огромная!

скрипт1 -> скрипт2 -> скрипт3

т.е. первый скрипт вызывает второй, а тот, в свою очередь третий.

Например в скрипте №2 мы напишем

text
X=17

внутри скрипта №2

text
echo $X 

выдаст 17. Но ни в скрипте №1, ни в №3 переменная X существовать НЕ будет.
мама не может влиять ни на бабушку, ни на дочку.

Однако, если в скрипте №2 мы напишем

text
export X=17

то это повлияет на скрипт №3, т.е. мама имеет (при желании) власть над своей дочкой. Но навязать своё мнение бабушке она никогда не сможет. Такие дела.

Если мы напишем в скрипте №1

text
source скрипт2

то всё изменится: В этом случае скрипт №1 и скрипт №2 станут единым целым, точно так-же, как если-бы мы просто вставили в скрипт№1 содержимое №2.
Естественно, в этом случае, переменные из №2 видны и в №1. А экспортированные и в №3.

Если это бинарник, а не скрипт, то всё остаётся также, за исключением того, что мы очевидно не сможем вставить в скрипт бинарник:
[console]# source /bin/true
-su: source: /bin/true: не могу запустить бинарный файл
[/console]

ЗЫЖ экспериментировать конечно надо, но только ПОСЛЕ прочтения документации.

Войдите или зарегистрируйтесь, чтобы ответить.