set + a не сбрасывает флаг -a

Предполагая, что под "всеми текстовыми файлами" вы подразумеваете все файлы, заканчивающиеся на .txt:

find / -type f -name '*.txt' -exec grep -i 'test123' {} \;

или

find / -type f -name '*.txt' -exec grep -i 'test123' {} +
4
22.06.2017, 20:23
3 ответа

Вывод: Да, set +aсбрасывает set -a, но из-за этого переменные не перестают экспортироваться. Каждая переменная затем должна быть не экспортирована или не установлена.


Опция allexport(аналогично set -a) позволяет автоматически экспортировать новыеи измененныепеременные. Переменные, существовавшие до активации опции set -a, не будут экспортированы.

Два момента перед тестированием:

  1. Условие set -aможно было вывести с помощью shopt -po allexport.
    И может быть изменен с помощью shopt -os allexportи shopt -ou allexport.

    $ шопт-по аллэкспорту
    установить +o allexport
    
    $ установить -а
    $ шопт -по allexport
    установить -o allexport
    
    $ установить +а
    $ шопт -по allexport
    установить +o allexport
    
  2. Способ оболочки для проверки переменных окружения заключается в проверке вывода команды environment, на самом деле grepit

    $ 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: 
3
27.01.2020, 20:48

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

$ unset VAR0
$ VAR0=def
$ ./script.py
('VAR0 is:', 'None')
2
27.01.2020, 20:48

Вы неправильно поняли, что делает set -a.Если переменная экспортируется, изменения этой переменной всегда отражаются в среде. (Это не всегда было верно для исторических реализаций sh, но это верно для всех современных POSIX-совместимых (-ish) оболочек.) Параметр -a только заставляет переменную для экспорта, даже если этого не было раньше: по умолчанию присваивание создает переменную оболочки, но когда действует -a, присваивание вызывает экспорт переменной, даже если она еще не была.

set +a сбрасывает параметр -a. Изменение значения экспортируемой переменной влияет на среду независимо от того, действует -a или нет.

5
27.01.2020, 20:48

Теги

Похожие вопросы