Предполагая, что под "всеми текстовыми файлами" вы подразумеваете все файлы, заканчивающиеся на .txt:
find / -type f -name '*.txt' -exec grep -i 'test123' {} \;
или
find / -type f -name '*.txt' -exec grep -i 'test123' {} +
Вывод: Да, set +a
сбрасывает set -a
, но из-за этого переменные не перестают экспортироваться. Каждая переменная затем должна быть не экспортирована или не установлена.
Опция allexport
(аналогично set -a
) позволяет автоматически экспортировать новыеи измененныепеременные. Переменные, существовавшие до активации опции set -a
, не будут экспортированы.
Два момента перед тестированием:
Условие set -a
можно было вывести с помощью shopt -po allexport
.
И может быть изменен с помощью shopt -os allexport
и shopt -ou allexport
.
$ шопт-по аллэкспорту
установить +o allexport
$ установить -а
$ шопт -по allexport
установить -o allexport
$ установить +а
$ шопт -по allexport
установить +o allexport
Способ оболочки для проверки переменных окружения заключается в проверке вывода команды environment
, на самом деле grep
it
$ env | grep ПУТЬ
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Нет необходимости во внешней программе из Python (которая требует компиляции при первом вызове). Вы все еще можете использовать его, если это делает вас счастливым, но в этом нет реальной необходимости.
Если опция не установлена (установить +a
). новаяпеременная небудет экспортирована.
$ unset VAR0
$ VAR0=abc
$ env | grep VAR0
# nothing is printed.
Или, если вы все еще хотите, чтобы ваша программа:
$ ./envtest.py
VAR0 is: None
Если изменить опцию -a
, переменная не будет экспортирована до тех пор, пока не будет изменена:
$ set -a
$ shopt -po allexport
set -o allexport
$ env | grep VAR0
$ ./envtest.py
VAR0 is: None
Если переменная изменится:
$ VAR0=bcd
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd
Но переменная останется в среде, если применяется set +a
:
$ set +a
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd
Даже если переменная изменена, она все еще является частью среды:
$ VAR0=xyz
$ env | grep VAR0
VAR0=xyz
$ ./envtest.py
VAR0 is: xyz
Пока она не будет экспортирована (удалена атрибут экспорта):
$ declare +x VAR0
Или он просто не установлен
$ env | grep VAR0
VAR0=xyz
$ unset VAR0
$ env | grep VAR0
Нет, присвоение пустого значения — это не то же самое:
$ VAR0=''
$ env | grep VAR0
VAR0=
Что ваша программа не показывает четко:
$ ./envtest.py
VAR0 is:
Это связано с тем, что присвоение локальной переменной оболочки теперь влияет на переменную среды. Если вы сначала отключите переменную, то будущие назначения будут работать только с локальной переменной оболочки, как и раньше:
$ unset VAR0
$ VAR0=def
$ ./script.py
('VAR0 is:', 'None')
Вы неправильно поняли, что делает set -a
.Если переменная экспортируется, изменения этой переменной всегда отражаются в среде. (Это не всегда было верно для исторических реализаций sh
, но это верно для всех современных POSIX-совместимых (-ish) оболочек.) Параметр -a
только заставляет переменную для экспорта, даже если этого не было раньше: по умолчанию присваивание создает переменную оболочки, но когда действует -a
, присваивание вызывает экспорт переменной, даже если она еще не была.
set +a
сбрасывает параметр -a
. Изменение значения экспортируемой переменной влияет на среду независимо от того, действует -a
или нет.