export Komutu ile Ortam Degiskenleri Tanimlama ve Yonetimi

Linux sistemlerde export komutu, kabuk degiskenlerini alt proseslere aktarmak icin kullanilan temel bir aractir. Gecici ve kalici ortam degiskeni tanimlama yontemlerini, PATH ve diger sistem degiskenlerini yonetmeyi bu yazida ele aliyoruz.

export Komutu: Ortam Degiskenleri Tanımlama ve Yonetimi

Bir sistem yoneticisi olarak gunun buyuk bolumunu terminal’de geciriyorsanız, ortam degiskenleri hayatınızın ayrılmaz bir parcasıdır. Ama cok kisi export komutunu yuzeysel biliyor: “bir degisken tanimlıyor” diyip geciyorlar. Oysa bu komutun arkasında oldukca derin bir mekanizma var. Bu yazıda export komutunu en temel kavramdan baslayarak, gercek dunya senaryolarıyla birlikte ele alacagız.

Ortam Degiskeni Nedir? Neden Onemlidir?

Linux/Unix sistemlerde her process kendi bellek alanında calısır. Bir program calısırken bazi bilgilere ihtiyac duyar: hangi dizinde calısıyorum, hangi kullanıcıyım, PATH’im nerede, hangi dili kullanacagım gibi. Iste bu bilgileri tasiyan mekanizmaya ortam degiskenleri (environment variables) diyoruz.

Ortam degiskenlerini iki kategoride dusunebilirsiniz:

  • Shell degiskenleri: Sadece mevcut shell oturumunda gecerlidir. Alt processlere aktarılmaz.
  • Ortam degiskenleri (exported): Mevcut shell ve ondan baslatılan tum alt processlere aktarılır.

Iste bu ikisi arasındaki farkı yaratan sey export komutudur.

# Shell degiskeni - sadece bu shell'de gecerli
MYVAR="merhaba"

# Ortam degiskenine donusturma - alt processlere de aktarılır
export MYVAR="merhaba"

# Kontrol edelim
bash -c 'echo $MYVAR'   # export edilmemisse bos cikar

Bu ufak ama kritik farkı anlamadan ilerlemek, sonradan cok kafa karistırıcı sorunlara yol acıyor. Bir cronjob’ın neden calısmadıgını ya da bir scriptin neden farklı davrandıgını arastırırken cogunlukla bu farka takılırsınız.

export Komutunun Temel Kullanımı

export Bash built-in bir komuttur, yani harici bir binary degil. type export yazarsanız “export is a shell builtin” cevabını alırsınız.

# Temel kullanim sekilleri:

# 1. Tanimlayarak export etme
export DBHOST="192.168.1.100"

# 2. Once tanimlayip sonra export etme
DBHOST="192.168.1.100"
export DBHOST

# 3. Birden fazla degisken ayni anda
export DBHOST="192.168.1.100" DBPORT="5432" DBNAME="production"

# 4. Mevcut ortam degiskenlerini listeleme
export -p

# 5. Readonly ortam degiskeni tanimlama
export -r SABIT_DEGER="degistirilemez"

export -p komutu cok kullanıslıdır. Mevcut shell’deki tum export edilmis degiskenleri declare -x formatında listeler. Bu listeyi bir dosyaya kaydedip baska bir ortamda kullanabilirsiniz.

PATH Degiskeni: En Cok Karsilasilan Senaryo

Muhtemelen export komutunu en sık PATH ile birlikte kullanıyorsunuzdur. Yeni bir binary kurdunuz ya da kendi scriptlerinizi bir dizine koydunuz ve terminalde calistırabilmek istiyorsunuz.

# Yanlis yontem - mevcut PATH'i siliyor
export PATH="/usr/local/myapp/bin"

# Dogru yontem - mevcut PATH'e ekleme yapıyor
export PATH="$PATH:/usr/local/myapp/bin"

# Basa ekleme (oncelik vermek icin)
export PATH="/usr/local/myapp/bin:$PATH"

# Kontrol
echo $PATH
which myapp

Dikkat: Ilk ornek gibi PATH’i sıfırlarsanız ls, cp, mv gibi temel komutlar bile calısmaz hale gelir. Cunku shell bu binary’lerin nerede oldugunu bilemez. Boyle bir durumda panik yapmayın, /bin/ls gibi tam yol kullanarak duzeltme yapabilirsiniz.

Gercek Dunya Senaryosu 1: Uygulama Konfigurasyonu

Bir Python veya Node.js uygulaması deploy ediyorsunuz. Veritabanı sifreleri, API anahtarları, port numaraları gibi bilgileri uygulamaya gecirmeniz gerekiyor. Bunları kod icine yazmak hem guvenlik acigi hem de kotu pratik.

# /etc/environment veya ~/.bashrc'ye ekliyoruz
export APP_ENV="production"
export DB_HOST="db.internal.company.com"
export DB_PORT="5432"
export DB_NAME="appdb"
export DB_USER="appuser"
export DB_PASSWORD="gizli_sifre_buraya"
export REDIS_URL="redis://cache.internal:6379"
export API_KEY="xxxx-yyyy-zzzz"
export LOG_LEVEL="warn"

# Uygulamayı baslatinca bu degiskenler otomatik aktarılır
./start_app.sh

Python tarafında bu degiskenlere os.environ.get('DB_HOST') ile, Node.js tarafında process.env.DB_HOST ile erisilebilir.

Peki ya bu degiskenlerin sistemde kalıcı olmasını istiyorsak? Tek seferlik terminal komutuyla tanimlanan degiskenler terminal kapanınca gider. Kalıcı hale getirmek icin uygun dosyaya eklememiz gerekiyor.

Degiskenlerin Omru: Nereye Yazılmalı?

Bu konu cok kisi tarafından karistırılıyor. Kısaca ozet:

  • ~/.bashrc – Sadece o kullanıcı icin, interactive non-login shell’lerde calısır
  • ~/.bash_profile veya ~/.profile – Sadece o kullanıcı icin, login shell’lerde calısır
  • /etc/environment – Tum kullanıcılar icin, sistem geneli, PAM tarafından okunur
  • /etc/profile – Tum kullanıcılar icin, login shell’lerde calısır
  • /etc/profile.d/*.sh – Modular yaklasim, her uygulama kendi dosyasını koyar
# ~/.bashrc'ye kalici degisken ekleme
echo 'export EDITOR="vim"' >> ~/.bashrc
echo 'export VISUAL="vim"' >> ~/.bashrc

# Degisikligi mevcut session'a uygulama
source ~/.bashrc
# ya da
. ~/.bashrc

# Sistem geneli degisken - /etc/environment
# Bu dosyada export kullanilmaz, direkt KEY=VALUE formati
echo 'JAVA_HOME=/usr/lib/jvm/java-17-openjdk' | sudo tee -a /etc/environment

# Modular yaklasim - /etc/profile.d/
cat > /etc/profile.d/myapp.sh << 'EOF'
export MYAPP_HOME="/opt/myapp"
export MYAPP_LOG="/var/log/myapp"
export PATH="$PATH:$MYAPP_HOME/bin"
EOF
sudo chmod +x /etc/profile.d/myapp.sh

Profesyonel ipucu: /etc/profile.d/ dizinini kullanmak cok daha temiz bir yaklasim. Her uygulama ya da konfigurasyonu kendi dosyasına yazarsınız, bir seyleri kaldırmanız gerektiginde sadece o dosyayı silmeniz yeterli. /etc/profile ya da ~/.bashrc icinde onlarca degisken aramanıza gerek kalmaz.

Gercek Dunya Senaryosu 2: Java JAVA_HOME Ayarı

Java dunyasında calisıyorsanız JAVA_HOME ayarlamak kacınılmaz. Birden fazla Java surumu olan bir sunucuda dogru surumu isaretlemek gerekiyor.

# Hangi java versiyonları yuklu?
update-alternatives --list java

# JAVA_HOME ayarlama
export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
export PATH="$JAVA_HOME/bin:$PATH"

# Dogrulama
java -version
echo $JAVA_HOME

# Maven ve Gradle da genelde JAVA_HOME'a ihtiyac duyar
export MAVEN_HOME="/opt/maven/3.9.0"
export PATH="$PATH:$MAVEN_HOME/bin"

# Tum degiskenleri kalici yapmak icin
cat >> ~/.bashrc << 'EOF'
export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
export MAVEN_HOME="/opt/maven/3.9.0"
export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH"
EOF

export -n: Degiskeni “Unexport” Etme

Cok az kisi bunu biliyor ama export -n ile bir degiskenin ortam degiskeni olma ozelligini kaldırabilirsiniz. Degisken hala shell’de var olur ama artık alt processlere aktarılmaz.

export TESTVAR="bu bir test"
bash -c 'echo "Alt process: $TESTVAR"'   # "bu bir test" cikar

export -n TESTVAR
bash -c 'echo "Alt process: $TESTVAR"'   # bos cikar

echo $TESTVAR   # Ana shell'de hala var: "bu bir test"
unset TESTVAR   # Tamamen silmek icin

Gercek Dunya Senaryosu 3: Script Icinde Ortam Degiskenleri

Bir deploy scripti ya da bakim scripti yazarken ortam degiskenlerini dikkatli yonetmek gerekiyor.

#!/bin/bash
# deploy.sh

# Script icinde kullanilacak degiskenler
export APP_NAME="mywebapp"
export DEPLOY_DIR="/var/www/${APP_NAME}"
export BACKUP_DIR="/backup/${APP_NAME}"
export TIMESTAMP=$(date +%Y%m%d_%H%M%S)
export LOG_FILE="/var/log/deploy_${TIMESTAMP}.log"

# Ortam kontrolu
if [ -z "$DB_PASSWORD" ]; then
    echo "HATA: DB_PASSWORD ortam degiskeni tanimlanmamis!"
    echo "Kullanim: DB_PASSWORD='sifre' ./deploy.sh"
    exit 1
fi

echo "Deploy basliyor: $APP_NAME - $TIMESTAMP" | tee -a $LOG_FILE

# Backup al
mkdir -p $BACKUP_DIR
tar -czf "${BACKUP_DIR}/backup_${TIMESTAMP}.tar.gz" $DEPLOY_DIR 2>> $LOG_FILE

# Deploy islemi
rsync -av --exclude='.env' ./dist/ $DEPLOY_DIR/ >> $LOG_FILE 2>&1

echo "Deploy tamamlandi!" | tee -a $LOG_FILE

Bu scripti calistırırken DB_PASSWORD’u gecici olarak ortam degiskeni olarak verebilirsiniz:

DB_PASSWORD="gizlisifre" ./deploy.sh

Bu yontemde DB_PASSWORD sadece o script sureci icin gecerlidir, bashrc’nize ya da history’nize yazmaz. Guvenlik acısından tercih edilmesi gereken yontem budur.

env Komutu ile Birlikte Kullanım

env komutu ortam degiskenlerini yonetmede export‘un kardes aracıdır. Mevcut ortamı temizleyerek ya da ek degiskenlerle bir komut calistırmanıza yarar.

# Mevcut tum ortam degiskenlerini listele
env

# Belirli degiskeni gecici olarak degistirerek komut calistirma
env HOME=/tmp bash -c 'echo $HOME'

# Temiz bir ortamda calistirma (hic ortam degiskeni olmadan)
env -i bash -c 'echo $HOME; echo $PATH'

# Birden fazla gecici degisken
env DB_HOST=test-db DB_PORT=5433 python3 app.py

# Ortam dosyasından okuma (bazi distrolarda)
env -i $(cat .env | xargs) ./start.sh

.env Dosyaları ve export

Modern uygulama gelistirme dunyasında .env dosyaları cok yaygin. Bu dosyaları shell’e yuklemek icin birkac yol var:

# .env dosyasi ornegi:
# DB_HOST=localhost
# DB_PORT=5432
# APP_SECRET=supersecret

# Yontem 1: set -a ile otomatik export
set -a
source .env
set +a

# Yontem 2: Her satiri export ile yukle
while IFS= read -r line || [[ -n "$line" ]]; do
    # Bos satır ve yorumları atla
    [[ -z "$line" || "$line" == #* ]] && continue
    export "$line"
done < .env

# Yontem 3: export ile xargs (basit durumlar icin)
export $(grep -v '^#' .env | xargs)

# Dogrulama
echo $DB_HOST
echo $APP_SECRET

Uyarı: .env dosyalarını asla Git’e commit etmeyin. .gitignore‘a ekleyin.

Sık Yapılan Hatalar

1. Bosluk kullanmak:

# YANLIS - bash bunu komut olarak yorumlar
export MYVAR = "deger"

# DOGRU
export MYVAR="deger"

2. Degiskeni alıntılamayı unutmak:

# Sorunlu - bosluk iceriyorsa parcalanır
export MSG=Merhaba Dunya

# Dogru
export MSG="Merhaba Dunya"

3. source yapmayı unutmak:

# .bashrc'yi duzenledikten sonra bu komutu calistirmazsaniz
# degisiklikler mevcut session'a uygulanmaz
source ~/.bashrc

4. Alt shell’de export etmek:

# Bu calistirma sekli ust shell'i etkilemez
bash -c 'export NEWVAR="test"'
echo $NEWVAR   # bos cikar

Ortam Degiskenlerini Debug Etme

Bir seylerin yanlıs gittigi durumlarda debug icin kullanıslı komutlar:

# Tum ortam degiskenlerini goster
printenv
env

# Belirli bir degiskeni goster
printenv PATH
printenv HOME

# Bir programin hangi ortam degiskenleriyle calıstıgını gor
cat /proc/<PID>/environ | tr '' 'n'

# Degiskenin nereden geldigi? (set ile butun degiskenleri goster)
set | grep MYVAR

# strace ile ortam takibi
strace -e trace=execve ./myscript.sh 2>&1 | head -20

Sonuc

export komutu basit gorunumune ragmen sistem yonetiminin temel taslarından biri. Dogru kullanıldıgında:

  • Uygulamalarınızı guclu bir sekilde konfigure edebilirsiniz
  • Hassas bilgileri kod disında tutabilirsiniz
  • Farkli ortamlar (dev, staging, prod) arasında gecisi kolaylastırabilirsiniz
  • Scriptlerinizi daha tasınabilir hale getirebilirsiniz

Ozetlemek gerekirse:

  • Gecici kullanım: Direkt terminalde export VAR=deger
  • Kullanıcı kalıcı: ~/.bashrc veya ~/.bash_profile
  • Sistem kalıcı: /etc/environment veya /etc/profile.d/
  • Script icinde: set -a; source .env; set +a ya da satirsatır okuma
  • Tek seferlik calistırma: ENV_VAR=deger ./script.sh

Ortam degiskenlerini iyi yonetmek, hem guvenlik hem de operasyonel verimlilik acısından size cok sey kazandırır. Bir sonraki sorun giderme seansınızda printenv ve export -p ciktılarına mutlaka bir goz atın, cok kez sizi kurtaracaklar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir