LINUX.ORG.RU
ФорумAdmin

export PATH

 ,


0

3

Всем привет

Вопрос касается export. Export превращает локальную переменную в переменную окружения. В bashrc есть такая строчка -

PATH=$PATH:/foo:/bar

export PATH

нахрен здесь export? ведь PATH и так переменная окружения. Я раньше думал, что для того, чтобы и значение этой переменной экспортнулось, но сегодня заметил, что и без export дочерняя сессия получает это значение - допустим, если написать

LANG=ru_RU.UTF-8

bash

echo $LANG

то значение будет ru_RU.UTF-8 без всякого экспорта.

То есть, как я понял, export просто превращает локальную переменную в переменную окружения и смысла его запускать для уже существующих переменных окружения нет, то есть бессмысленно писать export PATH, но зачем-то он везде прописан? ладно, предположим, что PATH до этого не задана но ведь сама переменная PATH=$PATH:/foo:/bar намекает, что используй существующую переменную PATH.



Последнее исправление: Datt_ (всего исправлений: 2)

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

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

Но это же глупая ситуация, нет? Эта строчка имеет смысл только в случае, если в /etc/profile кто-то стёр export PATH, при этом у всех пользователей в домашних директориях есть директория bin с каким-то заданными программами. Это вроде как настолько специфическая ситуация, что мне кажется глупостью ради такого писать лишнюю строчку в дефолтных настройках.

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

Это особенности реализации bash.
Например, в чистом sh на Солярке без export не сработает.

Хочешь, чтобы было максимально переносимо - пиши export.

И еще формулировка «export превращает локальную переменную в переменную окружения» не совсем верная. После того, как ты сделал export, переменная ведь не появляется в /proc/$$/environ? Значит, не превращает.

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

Ничего глупого, переменная может быть и не экспортирована как переменная окружения, просто попробуй создать переменную, а потом посмотри через bash export -p | grep имя_переменной ее не будет среди имен экспортированных в окружение переменных. Как и написал ранее никому не интересно ванговать или делать проверки, проще еще раз вызвать экспорт и все.

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

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

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

В смысле не сработает? Если поменять переменную среды (допустим LANG), то без экспорта дочерний процесс будет видеть дефолтный LANG?

Насчёт формулировки интересно. Тогда получается env показывает не переменные окружения, а комбинацию переменных окружения и локальных переменных с атрибутом export?

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

Это нормально для локальных переменных, но тут речь идёт про переменную окружения PATH. Как я уже писал –> та строчка имеет смысл только в случае, если в /etc/profile кто-то стёр export PATH. А это далеко не стандартная ситуация.

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

и как тогда задавать переменные окружения, если это не делает export ? Вроде как в /etc/profile написано export PATH, это значит, что PATH - это не переменная окружения? Но она же есть в environ.

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

Вообще очень странно слышать, что export не превращает переменную в переменную окружения. Весь интернет говорит, что она делает, но ман по export говорит про атрибут export. Покажите, пожалуйста, где-нибудь документацию, где написано, что именно делает export, почему это не переменная окружения и что тогда считается переменной окружения..

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

Та строчка имеет смысл в любом случае, т.к. до правки PATH имеет доступ любой пользователь и любой софт, опять же бывают нестандартные настройки особенно на оборудовании где система имеет урезанный вид, например какая-нибудь ip камера с ядром и некоторым окружением на борту, там вообще все окружение настраивается в скриптах инициализации которые запускаются с запуском устройства, никаких profile там обычно нет, и таких примеров достаточно. Если ты уверены что переменная окружения есть и она уже экспортирована можешь лично у себя не экспортировать, но если ты пишешь скрипты которые будет использовать кто-то другой уж будь добр не закладываться на умолчанное поведение твоей конкретной системы.

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

Ну ошибся он что ты его душишь? Ты и сам уже пол дня доказываешь что export можно не писать, но реальность такова, что это до первого окружения где нет никакого profile или еще какая-то иная причина.

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

Я не говорю про нестандартные ситуации и оборудование, я говорю про дефолтную десктопную систему.

Вы видимо не поняли вопроса. Нет, ладно, предположим, что каким-то макаром у меня не задалась переменная PATH как переменная окружения. Каким образом PATH=$PATH:/home/user/bin, который превратится в export PATH=/home/usr/bin исправит мою ситуацию?

Datt_
() автор топика
Последнее исправление: Datt_ (всего исправлений: 1)
Ответ на: комментарий от anonymous

Я не душу, я хочу уточнить, может он действительно правду говорит. Я это узнаю для ролика, где объясняю про переменные bash простым языком, но тут я узнаю, что моя формулировка не совсем верная. Я не хочу давать людям неправильную формулировку, даже если я говорю упрощенно, я хотел бы говорить правильно.

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

пажди, ну, не об этом речь. Для PATH они как разделитель, так что на 2 точки ему плевать в данном примере, что PATH=/home/usr/bin, что PATH=:/home/usr/bin

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

а вот и нет. на счёт двоеточия в начале не знаю, но точно знаю, что если двоеточие стоит в конце, то в PATH добавляется PWD, и будут запускаться программы из текущей директории, а это дыра в безопасности.

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

Я это узнаю для ролика, где объясняю про переменные bash простым языком, но тут я узнаю, что моя формулировка не совсем верная.

Скажу больше для .bashrc и bash не имеет никакой роли. Сюрпрайз что ошиблись именем файла ? Вы даже distrname и version не написали, могу предположить что это про deb* а не про bash

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

Ну ролик про bash, поэтому и речь про bashrc. Если ~/.bashrc указан в profile, то действительно не важен шелл. Но нужно понимать контекст - я говорю про баш для новичков, поэтому и привожу в пример ~/.bashrc.

Нет, не deb*, centos/rhel. Хотя в этом плане совсем без разницы.

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

Нет, не deb*, centos/rhel. Хотя в этом плане совсем без разницы.

Ну тогда и будем говорить что речь только про bash пропатченный шапкой. А не за все варианты.

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

В смысле не сработает? Если поменять переменную среды (допустим LANG), то без экспорта дочерний процесс будет видеть дефолтный LANG?

Да, именно так.

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

ну этот вариант у меня работает на Debian, Centos и Arch. Есть у вас пример дистра/баша, где bash не считывает файл ~/.bashrc ?

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

Хорошо, а что делает/создаёт переменную среды и в чём её смысл, если не «быть доступной дочерним процессам»?

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

Debian

dash

Centos

патченный bash от шапки

Arch

хз

Есть у вас пример дистра/баша, где bash не считывает файл ~/.bashrc

Ванильный из слаки. Дело в том что прописывается не в ~/.bashrc, на что я намекал.

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

dash -> /bin/sh, а не /bin/bash

bash он и в debian-е bash.

Дело в том что прописывается не в ~/.bashrc, на что я намекал?

не понял, на что вы намекали?

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

Бже, я щас заплачу.

Да, переменные среды правильнее задавать в .bash_profile, но, во первых, во многих дистрибутивах этот файл при запуске также считывает настройки с .bashrc, из-за чего технически без разницы, где добавлять переменные. Во вторых, я привёл пример с центоси, где по дефолту переменная PATH каким-то хером указана в ~/.bashrc.

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

Не плачьте. И гоните свои видосики про «про дефолтную десктопную систему». (В вакууме)

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

ну если $PWD будет перед остальными директориями, то можно представить ситуацию, когда кто-то положил зловредный скрипт в /tmp и назвал его ls. кто-то под рутом зайдёт в /tmp и выполнит ls: выполнится зловредный скрипт.

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

Натянуто, вариантов что кто-то напишет cd /tmp и потом ls немного. Я делал по другому. Одинаковое название, но что бы по path было выше.

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от teod0r

проверил, работает, если : в начале, то созданный мною ls с текущей директории запускается первым.

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

кто-то выше писал

а вот и нет. на счёт двоеточия в начале не знаю, но точно знаю, что если двоеточие стоит в конце

я проверил в начале и это работает.

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

Да, переменные среды правильнее задавать в .bash_profile, но, во первых, во многих дистрибутивах этот файл при запуске также считывает настройки с .bashrc

Вы хотите правды или где?

я привёл пример с центоси, где по дефолту переменная PATH каким-то хером указана в ~/.bashrc

Где в .bash_profile

if [ -f ~/.bashrc ]; then
   ~/.bashrc
fi 
Удивительно, не правда ли?

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

вообще это уязвимость в шеллах. по хорошему так быть не должно. хочешь добавить $PWD — добавь точку

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

я привёл пример с центоси, где по дефолту переменная PATH каким-то хером указана в ~/.bashrc.

И опять врете, как минимум копейка7 переменные PATH прописаны в ~/.bash_profile из каробки. Только что проверил.

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

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

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

Нет такого понятия в линуксе как стандартная система, есть ядро, есть posix, есть gnu или не gnu окружение, но даже учитывая posix мы не всегда имеем одинаковое расположение и иерархии директорий и файлов в них.

тут скорее ты пытаешься оправдать свой тупняк, чем я не понял твоего вопроса, хоть и мыслил в правильном направлении. Я же тебе уже сказал у себя можешь делать как хочешь, но как только ты делаешь не только для себя но и для кого-то еще придется пользоваться этой превентивной защитой от дурака.

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

Итого, весь ваш «видосик» опускается до уровня, как это сделать в centos 8. Так и писали бы в топике. Про остальное вам уже выше много раз ответили. А то зачем «багор» export.

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

Ты говоришь, что это защита от дурака, имея ввиду, что переменная PATH не была экспортирована ранее по какой-то причине? Как полученная запись PATH=:/home/user/bin защитит от дурака?

Datt_
() автор топика
Последнее исправление: Datt_ (всего исправлений: 1)
Ответ на: комментарий от anc

Весь мой видосик опускается до уровня «bash может читать ~/.bashrc и ~/.bash_profile» во всех знакомых мне дистрах, а так как ЦА моих видосов - абсолютные новички, то я не стану в каждом своём ролике вставлять фразу «ну знаете, есть еще слака, которую юзают полтора человека, в которой bash_profile не считывает bashrc».

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

Весь мой видосик опускается до уровня «bash может читать ~/.bashrc и ~/.bash_profile» во всех знакомых мне дистрах
во всех знакомых мне дистрах

Ну-ну а завтра что-то поменяют «во всех знакомых мне дистрах». Вам не кажется, что надо правильно доносить информацию? Например в виде пропишите в ~/.bash_profile но в distrname можете если у вас есть такой код в нем (~/.bash_profile) и в ~/.bashrc прописать. Чуем разницу?

ЗЫ Все равно первичен ~/.bash_profile

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

Я считаю, что полные новички должны освоить азы хотя бы одной системы. Когда я дойду до всяких условий, то покажу ему в файле .bash_profile ссылку на .bashrc и скажу - видите, здесь написано, что при наличии такого-то файла считывать его тоже. Но я не считаю правильным не пройдя информации хотя бы об одной системе, грузить новичков тем, что в других дистрах по другому. Пусть они увидят, как это работает, пусть поймут, как это работает и почему это работает так. А потом уже можно говорить, что в других дистрах это может работать по другому потому что вот тут написано так.

Вот отрывок текста со следующего ролика, про разницу файлов:

Мы с вами уже работали с файлом ~/.bashrc, и там можно задать переменную. Но основное предназначение bashrc – настройка алиасов и всяких функций bash для эмулятора терминала, который мы запускаем в системе. Правильнее говоря, в bashrc задаются настройки bash для интерактивной оболочки, в которой не нужно логинится – то есть, например, для эмулятора терминала – при запуске он у нас не требует логина и при этом нам нужно с ним вручную работать, то есть интерактивно. А скажем firefox обычно мы запускаем не через эмулятор терминала, а через лаунчер. И для случаев, когда нам нужно использовать какие-то переменные независимо от эмулятора терминала, то есть интерактивной оболочки, нам нужен другой файл - ~/.bash_profile (nano ~/.bash_profile ). Но на самом деле во многих дистрибутивах этот файл при запуске также считывает настройки с .bashrc, из-за чего технически без разницы, где добавлять переменные. Также в каких-то дистрибутивах этот файл обычно называет .profile. Так вот, переменную мы можем создать как в .bashrc, так и в .bash_profile, или вообще создать свой файл со всеми своими алиасами и переменными. Но я этого делать не буду, просто добавлю свою переменную в ~/.bash_profile (nano ~/.bash_profile, #My env variables, export TEST=test). Единственное что, этот файл считывается в момент моего логина, а значит недостаточно просто открыть новую bash сессию, а нужно перезайти в систему. В этом плане ~/.bashrc удобнее. Ну и если мы хотим, чтобы наши переменные работали не только для нашего пользователя, но и для всех других пользователей, то настраивать эти переменные нужно в файлах /etc/profile и /etc/bashrc. А если мы не хотим зависеть от bash-а, а использовать любую другую оболочку, то лучше указывать в /etc/environment.

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

LANG=ru_RU.UTF-8 - это немного другое, данная строка прописывается в /etc/profile.d/lang.sh В /etc/profile.d прописываются все переменные, которые нужны bash вне зависимости от того, в каком режиме он запущен: в интерактивном либо в неинтерактивном.

export PATH прописывается в /etc/bashrc то есть в скрипте, выполняюшимся при запуске bash в интерактивном режиме, эти переменные необходимы пользователю, работающему в консоли.

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

Да, я о различиях этих файлов написал в прошлом комменте. Мой вопрос был касательно смысла экспортирования переменной PATH в файле ~/.bashrc

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

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

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