Как сохранить файл environment

Обновлено: 06.07.2024

Android использует файловую систему, которая аналогична дисковым файловым системам на других платформах. Эта лекция описывает, как работать с файловой системой Android для чтения и записи файлов с помощью File API (перевод документации [1]).

Объект File подходит для чтения или записи больших объемов данных в порядке от начала до конца, без пропусков. Например, это хорошо подходит для файлов картинок или для различных обменов данными через сеть. Здесь будет показано, как выполнять базовые файловые операции в Вашем приложении. Подразумевается, что Вы знакомы с файловой системой Linux и стандартной системой ввода/вывода файлов в (standard file input/output API) в java.io.

[Выбор между внутренним и внешним хранилищем (Internal Storage, External Storage)]

Все устройства Android имеют две области хранения файлов (file storage area): "internal" и "external" storage. Эти имена появились на первых стадиях развития Android, когда большинство устройств поставлялись со встроенной энергонезависимой памятью FLASH (internal storage) плюс извлекаемый носитель памяти, такой как micro SD card (external storage). Некоторые устройства делили постоянную область хранения (permanent storage space) на разделы "internal" и "external", так что даже без наличия внешнего извлекаемого хранилища (removable storage medium) всегда имеется 2 пространства хранения, и поведение API всегда одинаково - независимо от того, есть в наличии внешнее хранилище или нет. Следующие списки подводят общую черту под фактическими различиями каждого пространства хранения.

Совет: несмотря на то, что приложения по умолчанию устанавливаются в internal storage, Вы можете указать атрибут android:installLocation в файле манифеста, после чего Ваше приложение может быть установлено и на external storage. Пользователи ценят эту опцию, когда размер APK очень велик, и размер external storage space больше, чем internal storage. Дополнительную информацию см. в документации App Install Location [2].

[Получение разрешения для приложения на доступ к External Storage]

Чтобы иметь возможность записи в external storage, Вы должны запросить в файле манифеста разрешение WRITE_EXTERNAL_STORAGE :

Внимание: в настоящее время приложения имеют возможность чтения external storage без специального на то разрешения. Однако это изменится в будущих релизах системы Android. Если Ваше приложение требует чтения external storage (но не записывает в него), то Вам нужно декларировать разрешение READ_EXTERNAL_STORAGE . Чтобы обеспечить будущую работу Вашего приложения так, как это ожидалось, Вы должны декларировать это разрешение уже сейчас, до того как изменения вступят в реальную силу.

Но если Ваше приложение использует разрешение WRITE_EXTERNAL_STORAGE, то это неявно дает ему также разрешение использовать и чтение external storage.

Вам не нужно получать никаких разрешений на сохранение файлов в internal storage. Ваше приложение всегда имеет разрешение на чтение и запись файлов в свой внутренний каталог на internal storage.

[Сохранение файла в Internal Storage]

Когда сохраняется файл в internal storage, Вы можете запросить подходящую директорию для объекта файла File вызовом одного из двух методов:

getFilesDir() возвращает объект File, представляющий внутренний каталог Вашего приложения.
getCacheDir() возвращает объект File, представляющий внутренний каталог временных файлов кэша Вашего приложения. Обязательно удаляйте оттуда каждый файл, когда он больше не нужен, и реализуйте разумный предел размера для объема памяти, который используете в любой момент времени, такой как предел в 1 мегабайт. Если система Android обнаружит, что на внутреннем хранилище недостаточно места, то она может удалить Ваши файлы кэша без предупреждения.

Чтобы создать новый файл в одной из этих директорий, Вы можете использовать конструктор File(), передав ему File, предоставленный одним из этих методов, которые укажут каталог на internal storage. Пример:

Альтернативно Вы можете вызвать openFileOutput(), чтобы получить FileOutputStream, который записывает файл в Вашей внутренней директории. Например, здесь показано, как записать некий текст в файл:

Или, если Вам нужно кэшировать некоторые файлы, Вы должны вместо этого использовать createTempFile() . Например, следующий метод вытаскивает имя файла из URL и создает файл с таким именем во внутренней директории для кэша Вашего приложения:

Примечание: каталог internal storage Вашего приложения указывается на основе имени пакета приложения в специальном месте файловой системы Android. Технически другое приложение может прочитать Ваши внутренние файлы, если Вы установите файловый режим с разрешенным чтением. Однако для этого другое приложение должно также знать имя пакета Вашего приложения и имена используемых Вашим приложением файлов. Другие приложения не могут просматривать Ваши внутренние директории, и не могут получить доступ на чтение или запись, за исключением случая, когда Вы явно установите файл как читаемый и/или записываемый. Таким образом, пока Вы используете MODE_PRIVATE для Ваших файлов на internal storage, то они никогда не будут доступны для других приложений.

[Сохранение файла в External Storage]

Поскольку external storage иногда может быть недоступно (когда пользователь смонтировал его как внешний USB-носитель на PC, или когда вытащил карту SD из телефона), то перед доступом к тому Вы должны всегда проверить, что он есть в наличии. Вы можете запросить состояние external storage вызовом getExternalStorageState() . Если возвращенное состояние External Storage равно MEDIA_MOUNTED , то Вы можете читать и записывать на него свои файлы. Например, следующие методы полезны для определения доступности устройства хранения:

Несмотря на то, что external storage может быть модифицировано пользователем и другими приложениями, есть две категории файлов, которые могут быть сохранены здесь:

Публичные файлы (Public files) - это файлы, которые должны быть свободно доступны для других приложений и пользователя. Когда пользователь деинсталлирует Ваше приложение, эти файлы должны остаться доступными для пользователя. Например, такими файлами могут быть фотографии, созданные другими приложениями или другие файлы, загруженные через сеть.

Частные файлы (Private files) - это файлы, полные права на которые принадлежат Вашему приложению, и которые должны быть удалены при деинсталляции Вашего приложения пользователем. Несмотря на то, что эти файлы технически доступны для пользователя и других приложений, поскольку они находятся на внешнем извлекаемом хранилище (external storage), эти файлы не имеют в реальности особого значения для пользователя вне Вашего приложения. Когда пользователь деинсталлирует Ваше приложение, система удалит все файлы в Вашем частном каталоге на внешнем хранилище. Примером таких файлов могут быть дополнительные ресурсы, загруженные Вашим приложением или временные медиафайлы.

Если Вы хотите сохранить public-файлы на external storage, используйте метод getExternalStoragePublicDirectory() для получения экземпляра File , предоставляющего подходящую директорию на external storage. Метод принимает аргумент, указывающий тип файла, который Вы хотите сохранить, так чтобы типы файла были логически организованы с другими public-файлами, такими как DIRECTORY_MUSIC или DIRECTORY_PICTURES . Пример:

Если Вы хотите сохранить файлы, которые являются частными (private) для Вашего приложения, Вы можете получить подходящую директорию вызовом метода getExternalFilesDir() и передачей ему имени, указывающего тип директории, который Вам нужен. Каждая директория, созданная таким способом, будет добавлена к родительской директории, в которой инкапсулированы все файлы внешнего хранилища Вашего приложения, которые система удалит, когда пользователь деинсталлирует Ваше приложение. Например, вот метод, которым Вы можете создать директорию индивидуального фотоальбома:

Если ни одно из предварительно определенных имен поддиректорий не подходит для Ваших файлов, то Вы можете вместо этого вызвать getExternalFilesDir() и передать null. Это возвратит корневую частную директорию для Вашего приложения на external storage.

Помните, что getExternalFilesDir() создает директорию внутри директории, которая будет удалена при деинсталляции Вашего приложения. Если файлы, которые Вы сохраняете, должны оставаться доступными после того, как пользователь деинсталлирует Ваше приложение - как например если Ваше приложение работает с фотокамерой, и пользователь хотел бы сохранить сделанные фотографии — Вы должны вместо этого использовать getExternalStoragePublicDirectory() .

Независимо от того, используете ли Вы для публичных файлов getExternalStoragePublicDirectory() или getExternalFilesDir() для частных файлов приложения, важно иметь в виду, что Вы используете имена директорий, предоставленные константами API наподобие DIRECTORY_PICTURES . Эти имена директорий гарантируют, что система будет правильно рассматривать эти файлы. Например файлы, сохраненные в DIRECTORY_RINGTONES , будут рассортированы медиасканером системы как рингтоны вместо музыки.

[Опрос количества свободного места]

Если Вы знаете заранее, сколько файлов сохраняете, то можете без получения ошибок IOException узнать, сколько места осталось путем вызова getFreeSpace() или getTotalSpace() . Эти методы предоставляют соответственно текущее доступное пространство и общее пространство на томе хранения. Эта информация также полезна, чтобы избежать переполнения тома хранения свыше определенного порога.

Однако система не гарантирует, что Вы можете записать столько байт, сколько показывает вызов getFreeSpace(). Если возвращенное количество всего на несколько мегабайт больше, чем Вам нужно сохранить, или если файловая система уже заполнена меньше, чем на 90%, то вероятно сохранение будет безопасным. Иначе возможно, что записать данные в хранилище не получится.

Внимание: Вам не обязательно проверять количество свободного места перед сохранения файла. Вместо этого Вы можете попробовать записать файл сразу же, и затем перехватить исключение IOException, если оно произойдет. Вы возможно, должны так поступить, когда не знаете, сколько места Вам нужно. Например, если Вы меняете способ кодирования файла перед его сохранением, преобразовывая картинку PNG в JPEG, то Вы не будете знать размер файла заранее.

[Удаление файла]

Вы всегда должны удалять файлы, которые Вам больше не нужны. Самый прямой способ удаления файла состоит в том, чтобы иметь этот файл открытым и вызвать delete() для самого себя.

Если файл сохранен на internal storage, Вы можете также запросить Context, чтобы найти и удалить файл вызовом deleteFile():

Внимание: когда пользователь деинсталлирует Ваше приложение, система Android удалит следующее:

• Все файлы, сохраненные Вашим приложением на internal storage.
• Все файлы, сохраненные Вашим приложением с использованием getExternalFilesDir().

Однако Вы должны регулярно удалять все кэшируемые файлы, создаваемые с getCacheDir(), и также регулярно удалять файлы, которые Вам больше не нужны.

[Пример записи файла на sdcard0]

Предположим, что необходимо записать какой-нибудь тестовый файл (с именем myFile.txt) в папку myFolder на внешний носитель, который виден в системе Android как sdcard0. Т. е. полный путь должен выглядеть примерно так:

Базовый путь до External Storage

Проблема тут состоит в том, чтобы узнать часть пути basePath, поскольку на разных системах Android этот путь будет разным, в зависимости от версии и внутреннего аппаратного устройства. В моем телефоне Samsung Galaxy Note этот basePath = /storage/sdcard0 , но это еще не значит, что на Вашем телефона этот путь будет именно таким. Чтобы получить basePath, используйте вызов функции getExternalStorageDirectory :

Проверка доступности носителя данных в External Storage

Вторая проблема состоит в доступности на запись носителя данных. Дело в том, что записать на носитель можно не всегда, например если он смонтирован как флешка USB (когда Ваш телефон подключен к компьютеру в режиме Mass Storage Device, USB MSD). Проверить доступность носителя можно следующей функцией:

Разрешение доступа к носителю данных в файле манифеста

Как уже упоминалось, необходимо в файле манифеста запросить разрешение WRITE_EXTERNAL_STORAGE . Вот пример такого файла манифеста:

Функция, которая сохраняет файл, принимая полный путь до файла filePath и сохраняемый текст FileContent:

Вызов функции SaveFile, который выполняет задачу сохранения файла в External-носителе:

[Пример записи файла на extSdCard]

Получение полного корневого пути до извлекаемой карты SD не так прост, как до External Storage, поскольку в API Android для этого почему-то не предусмотрены специальные простые функции. Приходится получать путь окольными путями, через имена системных папок. Вот код функции, которая получает путь до извлекаемой карты SD:

Вызов функции SaveFile, который выполняет задачу сохранения файла на извлекаемой карте SD:

[Сохранение бинарного файла (массива byte[])]

В предыдущих примерах мы рассматривали класс OutputStreamWriter , который позволяет записать строку String или массив символов char[]. Но как быть, если нужно записать массив байт byte[]? Для этого подойдет класс DataOutputStream . Пример:

Примеры вызовов getAbsolutePath:

[Ссылки]

Комментарии

В новых Android доступ на запись надо оформлять не в Манифесте. Вот что пишут: "Android added new permission model for Android 6.0 (Marshmallow). What Are Runtime Permissions? With Android 6.0 Marshmallow, Google introduced a new permission model that allows users to better understand why an application may be requesting specific permissions. Rather than the user blindly accepting all permissions at install time, the user is now prompted to accept permissions as they become necessary during application use.

microsin: ИМХО, это предупреждение чисто информационное, ничего не поменялось, разве что название. Раньше было все то же самое - перед установкой приложения Android показывает пользователю, какие действия будут разрешены приложению. Если пользователь согласен, то он подтверждает действие и установка продолжится, если нет - приложение не установится.

Где предпочтительное место для установки PATH envvar?

/.profile или же /etc/environment ?

Как обстоят дела, когда PATH устанавливается в обоих местах? Является ли конечный результат объединением обоих значений, установленных в этих двух местах?

4 ответа

Резюме:

Если вы хотите добавить путь (например, /your/additional/path ) на ваш PATH переменная только для вашего текущего пользователя и не для всех пользователей вашего компьютера, вы обычно ставите ее в конце

/.profile как в одном из этих двух примеров:

Обратите внимание, что приоритеты пути уменьшаются слева направо, поэтому первый путь имеет самый высокий приоритет. Если вы добавите свой путь слева от $PATH , он будет иметь наивысший приоритет, и исполняемые файлы в этом месте будут иметь приоритет над всеми остальными. Если вы добавите свой путь справа, он будет иметь самый низкий приоритет, и предпочтительными будут исполняемые файлы из других мест.

Однако, если вам нужно установить эту переменную среды для всех пользователей, я бы не советовал /etc/environment но создание файла с именем файла, оканчивающимся на .sh в /etc/profile.d/ , /etc/profile сценарий и все сценарии в /etc/profile.d являются глобальным эквивалентом каждого пользователя

/.profile и выполняются как обычные сценарии оболочки всеми оболочками во время их инициализации.

Более детально:

/etc/environment это системный файл конфигурации, что означает, что он используется всеми пользователями. Он принадлежит root хотя, так что вам нужно быть администратором и использовать sudo изменить это.

/.profile является одним из сценариев инициализации личной оболочки вашего собственного пользователя. Каждый пользователь имеет один и может редактировать свой файл, не затрагивая других.

/etc/profile а также /etc/profile.d/*.sh являются глобальными сценариями инициализации, которые эквивалентны

/.profile для каждого пользователя. Глобальные сценарии выполняются раньше пользовательских сценариев; и основной /etc/profile выполняет все *.sh сценарии в /etc/profile.d/ как раз перед тем, как выйти.

/etc/environment Файл обычно содержит только эту строку:

Это устанавливает PATH переменная для всех пользователей в системе к этому значению по умолчанию, которое не должно быть изменено основным способом. По крайней мере, вы не должны удалять какие-либо важные пути, такие как /bin , /sbin , /usr/bin а также /usr/sbin от него.

Этот файл читается как один из первых файлов конфигурации каждой оболочкой каждого пользователя. Обратите внимание, что это не скрипт оболочки. Это просто файл конфигурации, который каким-то образом анализируется и может содержать только назначения переменных окружения!

/.profile файл может содержать много вещей, по умолчанию он содержит среди прочего проверку, является ли

/bin каталог существует и добавляет, что к существующему пользователю PATH переменная, как это (в старых выпусках Ubuntu до 16.04 - более новые выпуски добавляют его безоговорочно):

Вы видите, что старая ценность PATH здесь используется повторно, и новый путь добавляется только в начало, а не перезаписывает все. Если вы хотите вручную добавить новые пути, вы также должны всегда сохранять старые $PATH значение где-то в новой строке.

Этот сценарий инициализации читается только оболочками пользователя, которому он принадлежит, но есть другое условие:

Поэтому, если вы используете оболочку Bash по умолчанию, вы должны убедиться, что у вас нет

/.bash_profile или же

/.bash_login если вы хотите изменения в

/.profile иметь эффект для вашего пользователя.

Этот ответ в основном о порядке, в котором переменные среды, такие как PATH назначаются, когда указано в разных файлах конфигурации. Я также расскажу, где вы должны их устанавливать, но в приведенном ниже списке файлы не перечислены в том порядке, в котором вы должны их использовать. Для общей информации о настройке PATH и другие переменные среды в Ubuntu, я также рекомендую прочитать EnvironmentVariables и другие ответы на этот вопрос.

Предпочтительное место для установки PATH зависит от того, для каких пользователей вам нужно установить его, и когда и как вы хотите, чтобы он был установлен. Часть вашего решения будет зависеть от того, хотите ли вы установить переменную среды для всех пользователей или для каждого пользователя. Если вы не уверены, то я рекомендую установить его только для одного пользователя (например, вашей учетной записи), а не для всей системы.

Как говорит AlexP, PATH Переменная окружения будет иметь значение, которое было ей присвоено в последний раз. На практике большую часть времени вы устанавливаете PATH Вы включаете старое значение PATH в новом значении, так что предыдущие записи сохраняются.

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

Таким образом, вы фактически запрашиваете порядок, в котором PATH настройки в различных файлах вступают в силу.

Общие, универсальные места для установки PATH перечислены ниже в том порядке, в котором они вступают в силу при входе пользователя в систему, а не в том порядке, в котором вы обычно должны их использовать. Каждое из мест, перечисленных ниже, является разумным выбором для настройки PATH в некоторых ситуациях, но только некоторые из них являются хорошим выбором в большинстве случаев.

В списке ниже вы увидите некоторые имена каталогов, такие как

/.profile , Если вы не знакомы с расширением тильды,

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

1. Для всех пользователей: /etc/environment

PAM в Ubuntu вызывает переменные среды, перечисленные в /etc/environment быть установленным, если этот файл существует, что по умолчанию он делает. Именно так чаще всего устанавливаются переменные среды для всех пользователей.

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

.orig Расширение специально не требуется - вы можете хорошо назвать имя файла резервной копии тем, что не смущает или уже используется. (Кроме того .orig , .old , .backup а также .bak общие.)

Вы можете редактировать этот файл любым способом, которым вы можете редактировать любой другой файл как пользователь root ( sudoedit /etc/enviromnment , sudo nano -w /etc/environment , gksudo gedit /etc/environment , так далее.)

/etc/environment не поддерживает автоматическое включение старого значения переменной. Но обычно это не нужно, поскольку большую часть времени вы устанавливаете переменную окружения для всех пользователей путем редактирования /etc/environment вы бы хотели, чтобы это было его начальное значение, когда пользователь входит в систему, в любом случае. Затем пользователь может изменить его так, как ему нравится. Обычно это полезно для пользователей.

2. Для всех пользователей: /etc/security/pam_env.conf

PAM считывает переменные среды для всех пользователей из /etc/security/pam_env.conf указывается с тем же синтаксисом, что и для каждого пользователя

/.pam_environment файлы (см. ниже).

Когда одна и та же переменная окружения установлена ​​в обоих /etc/environment а также /etc/security/pam_env.conf , значение в pam_env.conf используется - даже если это значение указано как DEFAULT скорее, чем OVERRIDE ,

Однако, когда вы заменяете строку в environment с одним в pam_env.conf , вы можете включить содержимое заменяемого значения. Смотрите раздел ниже на .pam_environment для деталей (так как он использует тот же синтаксис).

Обычно не нужно редактировать pam_env.conf и вы должны быть очень осторожны, если поступите так, поскольку неправильно сформированная строка, как правило, не позволяет всем обычным учетным записям войти в систему! Например, по умолчанию pam_env.conf содержит строки:

Это представлено как один из нескольких примеров. Одна из вещей, которую он иллюстрирует, состоит в том, как разбить назначение на несколько строк с помощью \ , Предположим, что вы раскомментировали только первую строку, но забыли раскомментировать вторую строку:

Не делай этого!

3. Для одного пользователя: .pam_environment в домашнем каталоге пользователя

Один из способов установить переменную среды для одного пользователя - это редактирование (или создание) этого пользователя. .pam_environment в их домашнем каталоге. Значения, установленные в этом файле, заменяют значения, установленные в глобальном /etc/environment файл.

.pam_environment не является частью скелета файлов, который копируется в домашнюю папку пользователя при первоначальном создании учетной записи пользователя. Однако, если вы создадите этот файл в своем домашнем каталоге, вы можете использовать его для установки переменных среды, таких как PATH , В отличие от /etc/environment (но, как /etc/security/pam_env.conf ), на пользователя .pam_environment Файлы поддерживают расширение старого значения переменной среды в новое. Однако они не являются сценариями оболочки, и для этого необходимо использовать специальный синтаксис, который несколько отличается от синтаксиса, который вы использовали бы в файле, таком как .profile ,

Например, если у вас был bin2 каталог в вашем домашнем каталоге, который вы хотите добавить в конец PATH , вы можете сделать это, добавив эту строку в .pam_environment :

/.pam_environment подраздел EnvironmentVariables (из которого приведенный выше пример тесно адаптирован), man pam_env , а также man pam_env.conf для дальнейших деталей.

Хотя это когда-то рекламировалось как предпочтительный способ для пользователей Ubuntu изменять или добавлять переменные среды и все еще считается разумным и приемлемым выбором, вы должны быть осторожны при редактировании .pam_environment , Как правки для всей системы /etc/security/pam_env.conf (см. выше), неправильная линия в пользовательском .pam_environment файл не позволит войти в систему (Я проверил это - специально на этот раз.) Для получения информации о том, как развивались рекомендации, см. Комментарии Gunnar Hjalmarsson ниже, и это ubuntu-devel обсуждение.

(Если у вас есть другие учетные записи, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не администратор и не могут sudo болеть, они все еще могут бежать su your-account и вам будет предложено ввести ваш (не их) пароль. Однако гостевая учетная запись не может этого сделать, так как запрещено использовать su взять на себя личность другого пользователя.)

4. Для всех пользователей: /etc/profile и файлы внутри /etc/profile.d/

Борн-совместимые оболочки (в том числе bash пользовательская оболочка по умолчанию в Ubuntu) запустите команды в /etc/profile когда вызывается как оболочка для входа.

Убунту /etc/profile.d заканчивается:

Это вызывает команды в любом файле в /etc/profile.d/ каталог, имя которого заканчивается .sh быть запущенным также

Большинство диспетчера отображения вызывают команды в /etc/profile (и, таким образом, файлы в /etc/profile.d ) для графического входа в систему тоже. Однако не все это делают, и это важный аргумент в пользу использования средств, предоставляемых PAM вместо этого (см. Выше) - если только в этой системе никогда не будет графического входа в систему, что может иметь место, например, если это сервер без установленного графического интерфейса.

Традиционно устанавливать общесистемные переменные среды в /etc/profile , но это часто уже не лучший выбор. Если вы не можете установить переменную среды в /etc/environment , и вы должны установить его для всех пользователей, тогда, вероятно, лучше сделать новый файл в /etc/profile.d/ чем редактировать /etc/profile сам. Одна из причин этого заключается в том, что при обновлении Ubuntu может появиться новое значение по умолчанию /etc/profile файл. В зависимости от того, как вы выполняете обновление, будет сохранен либо старый файл (с вашими изменениями), который будет содержать этот обновленный файл конфигурации, либо вам будет предложено разобраться с ситуацией.

Когда одна и та же переменная окружения установлена ​​в обоих /etc/profile и один или несколько файлов в /etc/profile.d что выполняется последним? Это зависит от того, /etc/profile которые устанавливают их, появляются до или после файлов в profile.d были получены (по коду, который я цитировал выше). Команды в /etc/profile выполняются в порядке их появления.

/etc/profile является сценарием оболочки, и его синтаксис не совпадает с синтаксисом файлов конфигурации PAM, описанных выше. Его синтаксис такой же, как синтаксис для пользователя

/.profile файл (см. ниже).

Если вам нужно написать код, который решает, следует ли добавить конкретный каталог в PATH (и сделать это для всех пользователей), вы не сможете использовать /etc/environment или же /etc/security/pam_env.conf сделать это. Это, пожалуй, главная ситуация, когда лучше использовать /etc/profile или же /etc/profile.d/ вместо.

5. Для одного пользователя: .bash_profile в домашнем каталоге пользователя

Если пользователь имеет

/.bash_profile Bash использует его вместо

/.bash_login (увидеть ниже). Вы не должны обычно иметь .bash_profile в вашем домашнем каталоге.

Если вы это сделаете, он обычно должен содержать команду для источника

/.profile (например, . "$HOME/.profile" ). В противном случае содержимое каждого пользователя .profile файл не запускается вообще.

6. Для одного пользователя: .bash_login в домашнем каталоге пользователя

Если пользователь имеет

/.bash_login Bash использует его вместо

/.profile (см. ниже), если

/.bash_profile существует, и в этом случае ни один из других не будет использоваться, если он не получен из `

Как с .bash_profile Вы, как правило, не должны иметь .bash_login файл в вашем домашнем каталоге.

7. Для одного пользователя: .profile в домашнем каталоге пользователя.

Когда оболочка в стиле Борна запускается как оболочка входа в систему, она запускает команды в /etc/profile (который обычно включает в себя команды, которые вызывают команды в файлах в /etc/profile.d/ быть запущенным - см. выше). После этого он запускает команды в .profile в домашнем каталоге пользователя. Этот файл является отдельным для каждого пользователя. (Bash на самом деле работает .bash_profile или же .bash_login вместо этого, если они существуют - но для пользователей в системе Ubuntu эти файлы редко должны или существуют. Подробнее см. Выше и 6.2. Файлы запуска Bash в руководстве по Bash.)

/.profile Таким образом, пользователь может размещать команды, которые запускаются при входе в систему. Это традиционное место для вас, чтобы установить PATH , но так как Ubuntu имеет модуль pam_env и поддерживает

/.pam_environment , вы должны рассмотреть возможность использования этого.

Как с /etc/profile Не все дисплеи диспетчера запускают этот файл для графического входа, хотя большинство из них. Это причина предпочитать

/.pam_environment для установки переменных окружения (сколько угодно /etc/environment в /etc/profile ).

Вы можете расширить переменные среды, в том числе PATH сам, когда вы установите PATH в .pam_environment (см. выше). Однако, если вам нужно установить PATH более изощренным способом, возможно, вам придется использовать .profile вместо. В частности, если вы хотите проверять, существует ли каталог каждый раз, когда пользователь входит в систему и только добавляет его в PATH если это произойдет, то вы не сможете использовать свой .pam_environment файл, чтобы добавить этот каталог к ​​вашему PATH ,

Например, по умолчанию для каждого пользователя .profile файл в Ubuntu используется для окончания:

Это проверяет, есть ли у вас bin подкаталог вашего домашнего каталога. Если это так, он добавляет этот подкаталог в начало вашего PATH ,

Этот список пропускает некоторые возможности.

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

Я пропустил несколько файлов, в которых люди иногда определяют переменные среды, например

/.bashrc а также /etc/bash.bashrc потому что они обычно не рекомендуются для установки PATH и это редко, что вы действительно должны использовать их для этой цели. Если вы используете эти файлы для добавления каталогов в PATH , то они иногда будут добавляться много раз, и это очень запутанно, когда вы исследуете $PATH , (В крайних случаях это может замедлить ход событий, но обычно это просто вопрос поддержания чистоты и понятности.)

поскольку bash это оболочка входа в систему по умолчанию для пользователей Ubuntu, и большинство пользователей используют ее или какую-либо другую POSIX-совместимую оболочку. Я пропустил информацию о том, как переменные среды задаются в других оболочках, отличных от Bourne, таких как tcsh ,

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

Думаю, это должно быть возможно, но не знаю, как это сделать. Может кто-нибудь мне помочь? Спасибо.

Вы можете использовать RegEdit для экспорта следующих двух ключей:

Первый набор - это системные / глобальные переменные среды; второй набор - переменные уровня пользователя. При необходимости отредактируйте, а затем импортируйте файлы .reg на новый компьютер.

запустите программу regedit, выделите нужные ключи и затем используйте опцию «файл -> экспорт», чтобы сохранить его как файл импорт выполняется двойным щелчком по файлу .reg при наличии прав администратора. ПРИМЕЧАНИЕ: это не все переменные среды (EV)! Я просто выполнил набор команд и испортил весь свой электромобиль. Я зашел в этот реестр, и там был только оригинальный электромобиль. Я восстановил систему и вернул все мои недостающие EV в PATH var. Этот реестр содержит только несколько необходимых EV, но не EV вашей программы или пути, которые вы задали вручную. ОСТОРОЖНО! В командной строке: echo path> mybackup.txt или set> mybackup.txt для всей резервной копии для ВСЕХ переменных / путей и ВСЕХ системных переменных / путей. @ejbytes Это копирует ваши глобальные переменные, которые вы установили, но, вероятно, лучше экспортировать их с помощью CLI, а не через реестр.

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

Чтобы импортировать переменные, можно использовать простой цикл:

Как импортировать обратно все экспортированные Env. Варс. из allvariables.txt Очень хорошо. Я просто потерял все свои переменные пути из-за неправильного набора путей, и мне пришлось выполнить восстановление системы. К счастью, на сегодняшний день у меня было последнее обновление. Я только что сделал резервную копию с помощью этой команды. Ницца. Это решение для реестра хранит только оригинальные переменные, но ничего, что было создано «вами» (как программист для новых сборок) или создало любую новую установку. В 64-разрядной версии Windows 7, если есть две переменные с одинаковыми именами на уровне пользователя и уровне системы, эта команда дает приоритет переменной уровня пользователя и пропускает первый уровень системы. Такое поведение имеет смысл, но решил, что стоит упомянуть, если кто-то ожидал полного набора от каждого типа переменных. эта команда действительно сработала: set > "C:\Users\xx\Desktop\envir variable.txt" Чтобы ответить Эшу, вы можете использовать простой цикл for в приглашении cmd, чтобы импортировать обратно все переменные: for /F %A in (allvariables.txt) do SET %A

Чтобы экспортировать пользовательские переменные, откройте командную строку и используйте regedit с / e

Объедините ответы @vincsilver и @jdigital с некоторыми изменениями,

  1. экспорт .reg в текущий каталог
  2. добавить отметку даты
СЕГОДНЯ переменная зависит от % DATE% , который зависит от того, как Windows , Locale предпочтений. Вышеупомянутая команда не работает для Индии. Это работает -> установите СЕГОДНЯ =% ДАТА:

Вы можете получить доступ к переменным среды в командной строке или в реестре.

Командная строка

Если вам нужна конкретная переменная среды, просто введите ее имя (например PATH ), за которым следует a > , и имя файла для записи. Следующее будет сбрасывать переменную среды PATH в файл с именем path.txt.

Метод реестра

Реестр Windows хранит все переменные среды в разных местах в зависимости от того, какой набор вам нужен. Вы можете использовать команды импорта / экспорта реестра, чтобы перенести их на другой компьютер.

Когда кто-то говорит "отредактируйте файл .plist" или "ваш .profile" или ".bash_profile" и т.д., это меня просто смущает. Я не знаю, где эти файлы, как их создавать, если я должен это делать и т.д., А также почему, похоже, так много разных (почему? Они делают разные вещи?)

Так может кто-то, может быть, очень терпеливо объяснить предыдущему пользователю Windows (желая отчаянно лучше познакомиться с приятным, если вначале несколько запутанным миром OS X), как это сделать шаг за шагом?

Мне нужны переменные, которые должны быть установлены как для приложений GUI, так и для приложений командной строки, и в настоящий момент для ant script, которым нужны переменные, но, скорее всего, будут другие потребности.

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

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

ОТВЕТЫ

Ответ 1

Во-первых, одна вещь, чтобы узнать о OS X, заключается в том, что она построена на Unix. Здесь появляется файл .bash_profile. Когда вы запускаете приложение Terminal в OS X, по умолчанию вы получаете оболочку bash. Оболочка bash поставляется из Unix и при загрузке запускает файл .bash_profile script. Вы можете изменить этот script, чтобы пользователь мог изменить ваши настройки. Этот файл находится по адресу:

Обновление для Mavericks

OS X Mavericks не использует environment.plist - по крайней мере, не для оконных приложений OS X. Вы можете использовать конфигурацию запуска для оконных приложений. Файл .bash_profile по-прежнему поддерживается, поскольку он является частью оболочки bash, используемой в терминале.

Только лев и горный лев

Оконные приложения OS X получают переменные среды из файла environment.plist. Вероятно, это означает, что вы используете файл ".plist". Этот файл находится по адресу:

Если вы внесете изменения в файл environment.plist, тогда приложения Windows OS X, включая приложение Terminal, будут иметь эти переменные окружения. Любая переменная среды, заданная в вашем .bash_profile, затронет только ваши оболочки bash.

Обычно я устанавливаю только переменные в файле .bash_profile и не изменяю файл .plist(или файл запуска на Mavericks). Большинство оконных приложений OS X не нуждаются в какой-либо настраиваемой среде. Только когда приложение действительно нуждается в определенной переменной среды, я должен изменить файл environment.plist(или файл запуска на Mavericks).

Похоже, что вы хотите изменить файл environment.plist, а не файл .bash_profile.

Последнее, если вы ищете эти файлы, я думаю, вы их не найдете. Если я правильно помню, они не были на моей начальной установке Льва.

Изменить: Вот несколько инструкций по созданию файла plist.

Чтобы отредактировать файл, вы можете нажать "Control", чтобы получить меню и выбрать "Добавить строку". Затем вы можете добавить пару ключевых значений. Для переменных среды ключ - это имя переменной среды, а значение является фактическим значением для этой переменной среды.

Как только файл plist будет создан, вы можете открыть его с помощью Xcode, чтобы изменить его в любое время.

Ответ 2

Ваш .profile или .bash_profile - это просто файлы, которые присутствуют в вашей "домашней" папке. Если вы откроете окно Finder и нажмете имя своей учетной записи на панели "Избранное", вы их не увидите. Если вы откроете окно терминала и ls для просмотра списка файлов, вы все равно их не увидите. Однако вы можете найти их, используя ls -a в терминале. Или, если вы откроете свой любимый текстовый редактор (скажем, TextEdit, поскольку он поставляется с OS X) и выполните File-> Открыть, а затем нажмите Command + Shift + . и щелкните по имени вашей учетной записи (домашняя папка), вы увидим их тоже. Если вы их не видите, вы можете создать их в своем любимом текстовом редакторе.

Теперь, добавление переменных окружения относительно просто и замечательно похоже на окна концептуально. В вашем .profile просто добавьте, по одному в строке, имя переменной и ее значение следующим образом:

Если вы изменяете переменную "PATH", обязательно включите системный PATH по умолчанию, который уже был установлен для вас:

Теперь вот странная часть: вы можете либо открыть новое окно терминала, чтобы новые переменные вступили в силу, либо вам нужно будет набрать .profile или .bash_profile чтобы перезагрузить файл и применить его к текущей среде терминала.

Вы можете проверить, что ваши изменения вступили в силу, используя команду "set" в вашем терминале. Просто введите set (или set | more если вы предпочитаете разбитый на страницы список) и убедитесь, что вы добавили файл.

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

Ответ 3

Здесь немного больше информации о переменной PATH в Lion OS 10.7.x:

Если вам нужно установить PATH глобально, PATH будет создан системой в следующем порядке:

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

BTW, чистая установка OS 10.7.x Lion не имеет environment.plist , который я могу найти, поэтому он может работать, но также может быть устаревшим.

Ответ 4

он печатает текущее значение пути

/.bash_profile и напишем

здесь вы добавляете старый путь, поэтому сохраняет старый путь и добавляет новый путь к нему

это выполнит его и добавит путь

затем снова проверьте с помощью

Ответ 5

Здесь простое решение без необходимости возиться с bash . В моем случае он работал gradle (для Android Studio ).

Btw, Эти шаги относятся к OSX (Mountain Lion 10.8.5)

Выполните следующую команду:

sudo nano /etc/paths (или sudo vim /etc/paths для vim)

nano

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

Вы должны увидеть новый путь, добавленный в конец PATH

Я надеюсь, что это может помочь кому-то еще

Ответ 6

Упрощенное объяснение

Этот пост/вопрос старый, поэтому я отвечу на упрощенную версию для пользователей OS X Lion. По умолчанию OSX Lion не имеет ни одного из следующих файлов:

В лучшем случае, если вы сделали что-либо в терминале, вы можете увидеть

Что это значит

Вы должны создать файл, чтобы установить свои команды по умолчанию bash (обычно в

/.bashrc). Для этого используйте любой редактор, хотя это проще сделать в терминале:

  • % > emacs.profile
  • [from w/in emacs type:] source

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

/.bashrc вы должны иметь source

/.bash_aliases и поместить все свои команды псевдонимов в

Ответ 7

Что сработало для меня, так это создать .launchd.conf с необходимыми переменными:

Этот файл читается startd при входе в систему. Вы можете добавить переменную "на лету" к запущенному запуску с помощью:

Фактически, .launchd.cond просто содержит команды launchctl.

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

Если вы пытаетесь установить переменные LANG или LC_ таким образом, и вы используете iTerm2, убедитесь, что вы отключили параметр "Установить языковые переменные автоматически" на вкладке "Терминал" профиля, который вы с помощью. Это, кажется, переопределяет переменные среды запуска, и в моем случае была установлена ​​неисправная проблема LC_CTYPE, вызывающая проблемы на удаленных серверах (которые получили переданную переменную).

(Тем не менее, среда environment.plist работает на моем Льве. Вы можете использовать панель предпочтений RCenvironment, чтобы сохранить файл вместо этого вручную редактируя его или требуется Xcode. По-видимому, он работает на Lion, хотя последнее обновление относится к эпохе Snow Leopard. Делает это мой личный предпочтительный метод.)

Ответ 8

Установите переменную среды PATH в Mac OS

Откройте программу терминала (это по умолчанию используется в папке Applications/Utilites). Выполните следующую команду

Это откроет файл в текстовом редакторе по умолчанию.

Для ANDROID SDK в качестве примера:

Вам нужно добавить путь к каталогу инструментов и инструментов платформы Android SDK. В моем примере я буду использовать "/Development/android-sdk-macosx" в качестве каталога, в который установлен SDK. Добавьте следующую строку:

Сохраните файл и закройте текстовый редактор. Выполните свой .bash_profile, чтобы обновить PATH.

Теперь каждый раз, когда вы открываете программу терминалов, в которой PATH будет включать Android SDK.

Ответ 9

Это было довольно прямолинейно и работало для меня, в терминале:

Ответ 10

Применить изменения к системе (нет необходимости перезагружать компьютер):

(Также работаем с macOS Sierra 10.12.1)

Ответ 11

Перейдите в папку /Applications/eclipse/Eclipse.app/Contents

Измените файл Info.plist текстовым редактором (или XCode), добавьте словарь LSEnvironment для переменной окружения с полным путем. Обратите внимание, что он включает также /usr/bin и т.д.:

Обновить параметры для приложения с помощью

Ответ 12

Позвольте мне проиллюстрировать вас из моего личного примера в очень излишней форме.

enter image description here

Иногда macOS или Linux автоматически устанавливают переменную окружения для вас, в отличие от Windows. Но это не всегда так. Так что давай проверим это. Строка сразу после echo $ JAVA_HOME будет пустой, если переменная окружения не установлена. Он должен быть пустым в вашем случае.

enter image description here

Теперь нам нужно проверить, есть ли у нас файл bash_profile. Вы видели, что в моем случае у нас уже есть bash_profile. Если нет, мы должны создать файл bash_profile.

enter image description here

Создайте файл bash_profile.

enter image description here

Проверьте еще раз, чтобы убедиться, что файл bash_profile находится там.

enter image description here

Теперь давайте откроем файл bash_profile. macOS открывает его, используя программу TextEdit по умолчанию.

enter image description here

Откройте терминал снова. Давайте проверим, установлена ли переменная окружения.

Ответ 13

Я взял идиотский маршрут. Добавлено их до конца /etc/profile

создана папка /etc/environment создайте в нем файл "oracle" или "whatever" и добавьте материал, который мне нужно установить глобально.

Ответ 14

Более подробная информация, которая может быть полезной для кого-то:

Из-за моих собственных исследований я теперь знаю, как установить переменные среды в 7 из 8 разных способов. Я пытался получить envar через приложение, которое я разрабатываю под Xcode. Я установил envars "tracer", используя эти разные методы, чтобы сказать, какие из них попадают в сферу моего приложения. Из нижеследующего вы можете видеть, что редактирование "схемы" в Xcode для добавления аргументов работает, как и "putenv". Что не установлено в этой области:

/.MACOS/environment.plist, специфичный для приложения plist,.profile и добавление фазы сборки для запуска пользовательского script (я нашел другой способ в Xcode [по крайней мере] установить, но забыл, что я назвал трассировщиком, и не могу найти его сейчас, может быть, это на другой машине. )

. с другой стороны, если я заеду в Терминал и скажу "set", кажется, что единственное, что он получает, это тот, что из .profile(я бы подумал, что он заберет environment.plist, и Я уверен, что как только я увижу второй трейсер-энвар в Терминале, так что с того времени что-то сменилось. Длинный день. )

Ответ 15

Теперь откроется текстовый редактор:

Шаг 2: имя переменной должно быть прописным. в этом примере переменная NODE_ENV

Читайте также: