GNU/Linux >> Belajar Linux >  >> Linux

Setel +a Tidak Hapus Bendera -a?

Pada Mac 10.11.6, menggunakan GNU bash, versi 3.2.57(1)-release (x86_64-apple-darwin15) set +a perintah tampaknya tidak berfungsi:

script.py

#!/usr/bin/python
import os
print("VAR0 is:", os.environ.get("VAR0")

Perintah:

$ VAR0=abc
$ ./script.py
('VAR0 is:', None)   # expected
$ set -a
$ VAR0=abc
$ ./script.py
('VAR0 is:', 'abc')   # expected, VAR0 has been exported to the environment and script.py has access to it
$ set +a
$ VAR0=def
$ ./script.py
('VAR0 is:', 'def')   # <= unexpected

Jawaban yang Diterima:

Ambil:Ya, set +a unsets set -a tetapi variabel tidak menjadi tidak diekspor karena itu. Setiap variabel kemudian harus tidak diekspor atau tidak disetel.

Opsi allexport (Sama seperti set -a ) memungkinkan ekspor otomatis baru dan berubah variabel. Variabel yang ada sebelum mengaktifkan set -a opsi tidak akan diekspor.

Dua poin sebelum pengujian:

  1. Kondisi set -a bisa dicetak dengan shopt -po allexport .
    Dan bisa diganti dengan shopt -os allexport dan shopt -ou allexport .

    $ shopt -po allexport
    set +o allexport
    
    $ set -a
    $ shopt -po allexport
    set -o allexport
    
    $ set +a
    $ shopt -po allexport
    set +o allexport
    
  2. Cara shell untuk menguji variabel lingkungan adalah dengan memeriksa output dari environment perintah, sebenarnya ke grep itu

    $ env | grep PATH
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    

Tidak perlu program eksternal dari python (yang perlu dikompilasi pada panggilan pertama). Anda masih dapat menggunakannya jika itu membuat Anda bahagia, tetapi sebenarnya tidak perlu untuk itu.

Jika opsi tidak disetel (set +a ). baru variabel akan tidak diekspor.

$ unset VAR0
$ VAR0=abc
$ env | grep VAR0
                      # nothing is printed.

Atau, jika Anda masih menginginkan program Anda:

$ ./envtest.py
VAR0 is: None

Jika -a opsi diubah, var tidak akan diekspor sampai diubah:

$ set -a
$ shopt -po allexport
set -o allexport
$ env | grep VAR0
$ ./envtest.py
VAR0 is: None

Jika variabel berubah:

$ VAR0=bcd
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

Tetapi variabel akan tetap berada di lingkungan jika set +a diterapkan:

$ set +a
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

Bahkan jika var diubah, itu masih merupakan bagian dari lingkungan:

$ VAR0=xyz
$ env | grep VAR0
VAR0=xyz
$ ./envtest.py
VAR0 is: xyz

Sampai tidak diekspor (hapus atribut ekspor):

$ declare +x VAR0

Atau hanya unset

$ env | grep VAR0
VAR0=xyz
$ unset VAR0
$ env | grep VAR0

Tidak, menetapkan nilai kosong tidak sama:

$ VAR0=''
$ env | grep VAR0
VAR0=

Yang mana program Anda tidak menunjukkannya dengan jelas:

$ ./envtest.py
VAR0 is: 

Linux
  1. Panggilan balik terdaftar tidak cocok dengan URL yang disediakan – Perbaiki Kesalahan WSO2

  2. Mengapa Ekspresi Reguler Bekerja Di X Tapi Tidak Di Y?

  3. Mengapa `md5sum` Tidak Memberikan Hash yang Sama Seperti Internet?

  1. Mengapa Cara Berikut Tidak Mengubah Ukuran Batas File Inti?

  2. Di mana Default Variabel Lingkungan Istilah Ditetapkan?

  3. Mengapa File Terjemahan Bash Tidak Berisi Semua Teks Kesalahan?

  1. Mengapa `keluar &` Tidak Berfungsi?

  2. Perintah "java" tidak menjalankan JVM yang telah diinstal

  3. emulator android tidak mulai, avd