Menggunakan ekspor dalam .bashrc

45

Saya perhatikan di .bashrcbeberapa baris saya ada exportdi depannya, seperti

export HISTTIMEFORMAT="%b-%d  %H:%M  "
...
export MYSQL_HISTFILE="/root/.mysql_history"

sedangkan yang lain tidak, seperti

HISTSIZE=100000

Saya bertanya-tanya jika, pertama, ini benar, dan kedua apa aturan adalah untuk menggunakan exportdi .bashrc.

Martin Vegter
sumber

Jawaban:

53

Anda hanya perlu exportvariabel yang harus "dilihat" oleh program lain yang Anda luncurkan di shell, sementara yang hanya digunakan di dalam shell itu sendiri tidak perlu exportdiedit.

Inilah yang dikatakan halaman manual:

The  supplied  names are marked for automatic export to the environ‐
ment of subsequently executed commands.  If the -f option is  given,
the  names  refer to functions.  If no names are given, or if the -p
option is supplied, a list of all names that are  exported  in  this
shell  is  printed.   The -n option causes the export property to be
removed from each name.  If a variable name is  followed  by  =word,
the  value  of  the variable is set to word.  export returns an exit
status of 0 unless an invalid option  is  encountered,  one  of  the
names  is  not a valid shell variable name, or -f is supplied with a
name that is not a function.

Ini dapat ditunjukkan dengan yang berikut:

$ MYVAR="value"
$ echo ${MYVAR}
value
$ echo 'echo ${MYVAR}' > echo.sh
$ chmod +x echo.sh
$ ./echo.sh

$ export MYVAR="value-exported"
$ ./echo.sh
value-exported

Penjelasan:

  • Saya pertama kali ditetapkan ${MYVAR}menjadi variabel Shell dengan MYVAR="value". Menggunakan echoI can echo nilainya karena echo adalah bagian dari shell.
  • Lalu saya buat echo.sh. Itu adalah skrip kecil yang pada dasarnya melakukan hal yang sama, hanya bergema ${MYVAR}, tetapi perbedaannya adalah skrip akan berjalan dalam proses yang berbeda karena skrip terpisah.
  • Ketika memanggilnya echo.shtidak menghasilkan apa-apa, karena proses baru tidak mewarisi${MYVAR}
  • Lalu saya ekspor ${MYVAR}ke lingkungan saya dengan exportkata kunci
  • Ketika saya sekarang menjalankan hal yang sama echo.shlagi, itu menggemakan konten ${MYVAR}karena mendapatkannya dari lingkungan

Jadi, untuk menjawab pertanyaanmu:

Itu tergantung di mana variabel akan digunakan, apakah Anda harus mengekspornya atau tidak.

ulangan
sumber
17

Gunakan exportuntuk variabel lingkungan . Variabel lingkungan adalah fitur sistem operasi. Variabel lingkungan diwarisi oleh proses anak: jika Anda mengaturnya di shell, mereka tersedia di semua program yang dimulai oleh shell ini. Variabel yang digunakan oleh banyak aplikasi atau oleh aplikasi spesifik selain cangkang adalah variabel lingkungan. Berikut adalah beberapa contoh variabel lingkungan umum:

  • HOME- menunjukkan direktori home pengguna, yang merupakan tempat file konfigurasi per-pengguna berada. Digunakan oleh program apa pun yang membaca file konfigurasi per pengguna atau perlu mengetahui lokasi direktori home pengguna.
  • PATH- menunjukkan tempat menemukan file yang dapat dieksekusi untuk meluncurkan program lain. Digunakan oleh setiap program yang perlu memulai program lain.
  • LD_LIBRARY_PATH- menunjukkan di mana menemukan file perpustakaan dinamis. Digunakan oleh setiap executable yang terhubung secara dinamis.
  • EDITOR, VISUAL- menunjukkan program apa yang harus dijalankan ketika editor diperlukan. Digunakan oleh program apa pun yang perlu meluncurkan editor teks.
  • DISPLAY, XAUTHORITY- menunjukkan cara terhubung ke server X11. Digunakan oleh klien X11 (yaitu program GUI).
  • LESS- Opsi dihidupkan secara otomatis saat lessdijalankan. Digunakan oleh less.
  • http_proxy- menunjukkan proxy web untuk digunakan. Digunakan oleh sebagian besar browser web.

Jangan gunakan exportuntuk variabel shell. Variabel shell adalah fitur shell sebagai bahasa pemrograman. Variabel Shell hanya digunakan di dalam shell di mana mereka ditetapkan; mereka tidak memiliki arti terhadap program yang diluncurkan oleh shell. Variabel Shell digandakan ketika subkulit dibuat, seperti sisa dari status shell. Berikut adalah beberapa contoh variabel shell yang memiliki arti untuk shell populer:

  • PS1 - prompt untuk ditampilkan sebelum setiap perintah.
  • IFS - karakter yang memisahkan kata-kata dalam ekspansi variabel yang tidak dikutip dan penggantian perintah.
  • HISTFILE - file tempat shell akan menulis histori perintah.

Selain variabel yang digunakan oleh shell, sebagian besar skrip shell menggunakan variabel untuk keperluan internal mereka.

Sebagian besar variabel lingkungan (misalnya PATH) masuk akal untuk seluruh sesi, dan harus ditetapkan dalam ~/.profileatau file yang serupa. Variabel yang masuk akal hanya untuk shell tertentu (misalnya PS1) harus diatur dalam file spesifik shell seperti ~/.bashrcatau ~/.zshrc. Lihat Apakah ada file setara ".bashrc" yang dibaca oleh semua shell?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Untuk variabel internal bash, Anda tidak perlu export. Dari contoh Anda HISTTIMEFORMATdigunakan oleh bash itu sendiri dan tidak perlu ekspor MYSQL_HISTFILEuntuk mysqldan yang membutuhkan ekspor sebaliknya mysqltidak melihatnya.

Zelda
sumber