В среде стандартного процесса нет ничего для создания переменной только для чтения, только не окружает, имеют то понятие для их собственной среды/переменных (эти два накладываются способами, но они должны быть поняты как отличные). То же касается свойств типа как целое число, массив, функция и т.д.
Вы рассмотрели использование ограниченной оболочки, как rbash
? Вы могли установить rbash
работать readonly TEST_ENV
) в его сценарии запуска. rbash
может быть слишком строгим, хотя, но это обращается до хорошей степени к повышению проблем комментариев.
Среда является частью чтения-записи каждого процесса (см. здесь и здесь для деталей), мало того, что процесс может записать непосредственно в часть данных (через environ[]
), это может изменить указатели на него. Вы смогли делать что-то с этим (т.е. перемещать к странице только для чтения), если Вы являетесь опытными в блоке и можете найти свой путь вокруг crt
запустите код, но я не рекомендую это ;-)
Если существуют определенные команды, которые пользователи выполняют, который должен иметь определенную среду, Вы можете устанавливать только группу - выполняют и используют sudo
установить корректные переменные (например, через /etc/environment
или env_file
директива) и выполненный команда как определенная группа (сохраняющий uid). Поддержка последних версий noexec
на большинстве платформ, которые могут использоваться для предотвращения выполнения новой оболочки (хотя банка может повредить программы который законно fork()
и exec()
).
Как последняя опция Вы можете использовать LD_PRELOAD
и Ваша собственная библиотека для установки управляемой среды для некоторых/всех пользовательских процессов путем обертывания соответствующих функций libc (getenv() putenv()
и т.д.). libfaketime делает точно это в течение времени связанные функции libc. Существует менее известный инструмент, названный timetravel, который делает подобный, но также и рычаги setenv()
и getenv()
чтобы удержать контроль над LD_PRELOAD
перед лицом бедственной ситуации.
Самый устойчивый подход должен отфильтровать setenv() unsetenv() putenv()
(и возможно clearnv()
) вызовы для предотвращения модификации и фильтра getenv()
так, чтобы это всегда возвратило необходимое значение (возможно из файла). Этот подход не предотвратит непосредственное управление памятью среды через environ[]
, но, пока Вы управляете getenv()
любой процесс, который полагается на libc API, должен видеть Ваше значение. bash
использование environ[]
непосредственно, когда это инициализирует, но также и вызовы getenv()
.
Предполагая этот макет:
% tree -L 2
.
├── top-1
└── top-2
├── sub-1
├── sub-2
└── sub-3
И этот желаемый результат:
% tree -L 2
.
├── top-1
│ ├── sub-1 -> /tmp/sf-582772/top-2/sub-1
│ ├── sub-2 -> /tmp/sf-582772/top-2/sub-2
│ └── sub-3 -> /tmp/sf-582772/top-2/sub-3
└── top-2
├── sub-1
├── sub-2
└── sub-3
И эта версия find
:
% find --version
find (GNU findutils) 4.4.2
Использование:
find /tmp/sf-582772/top-2/ -maxdepth 1 -mindepth 1 -type d -exec ln -s '{}' /tmp/sf-582772/top-1/ \;
Замена здесь приведены полные пути к нужным вам каталогам. Вот версия с относительными путями:
% pwd
/tmp/sf-582772
% find top-2 -maxdepth 1 -mindepth 1 -type d -exec ln -s ../'{}' top-1/ \;
Дает:
% tree -L 2
.
├── top-1
│ ├── sub-1 -> ../top-2/sub-1
│ ├── sub-2 -> ../top-2/sub-2
│ └── sub-3 -> ../top-2/sub-3
└── top-2
├── sub-1
├── sub-2
└── sub-3
Я не поклонник аргумента -exec, чтобы найти, и не поклонник того, чтобы выяснить, как точно избежать литералов, поэтому я обычно качаюсь, чтобы найти + xargs.[119997].
Возможно, мне что-то не хватает, иначе это нужно запускать каждый раз, когда новый каталог создается в базе. У меня это работает.
ln -s /base/* /target && ls -l /target
Наткнувшись на ответ, похожий на то, что ищет спрашивающий, я решил добавить обновление для будущих людей, которые будут его изучать.
Итак, главное убедиться, что целевой каталог еще не существует!
Пример:
target-directory
ln -s /path/to/base-directory/ /path/to/target-directory
Итак, по исходному вопросу:
folder2
ln -s /home/chris/folder1/ /home/john/folder2
Надеюсь, это поможет.