← Back to list

Linux Kullanıcı Yönetimi: Shell Türleri: Interactive ve Non-Interactive

Alias, Variable, Environment Variable, History Komutları

Özcan Kara · 2026-08-17 00:37 · 2 claps · 9.0 min read
#linux #linux-tutorial #linux-commands #shell-script #linux-shell
Open on Medium ↗
Wiki topics: 🔓 · Open Source 🥊 · Combat Sports

Linux Kullanıcı Yönetimi: Shell Türleri: Interactive ve Non-Interactive

Alias, Variable, Environment Variable, History Komutları

Terminalde geçirdiğimiz sürenin büyük kısmı aslında aynı komutları tekrar tekrar yazmakla geçiyor. Bu yazıda shell’i kendimize göre şekillendirmemizi sağlayan dört temel konuyu ele alacağız: alias, variable, environment variable ve history. Sonunda da bu ayarların neden bazen kaybolduğunu, kalıcı hale getirmek için hangi dosyaya yazmamız gerektiğini shell türleri üzerinden inceleyeceğiz.

Alias — Takma İsim

Alias, uzun komutları kısaltmaya yarar. Mantığı basit: bir takma isim veriyoruz, karşılığına çalışmasını istediğimiz komutu yazıyoruz.

Syntax:

alias [takma_isim]='komut'

Basit bir örnekle başlayalım:

[ec2-user@ip-10-0-47-213 ~]$ alias eo="echo 'ozcan bir değişkendir'"
[ec2-user@ip-10-0-47-213 ~]$ eo
ozcan bir değişkendir

Tırnak kullanımına dikkat

String tanımlarken tek tırnak da çift tırnak da kullanılabilir. Ancak alias gibi iç içe tırnak gereken yerlerde bir kural var: dışarıda çift tırnak varsa içeride tek tırnak, dışarıda tek tırnak varsa içeride çift tırnak kullanılmalı.

Aksi halde escape karakterleri (\) olduğu gibi ekrana basılır:

[ec2-user@ip-10-0-47-213 ~]$ alias eo="echo 'ozcan\ bir\ değişkendir'"
[ec2-user@ip-10-0-47-213 ~]$ eo
ozcan\ bir\ değişkendir

Doğru kullanım şu şekilde:

[ec2-user@ip-10-0-47-213 ~]$ alias eo="echo 'ozcan bir değişkendir'"
[ec2-user@ip-10-0-47-213 ~]$ eo
ozcan bir değişkendir

Buradaki fark önemli: tırnak olmadan yazarsak bash bunu komut olarak yorumlar, tırnakla yazarsak string haline gelir. Özellikle bir alias’ın değerini başka bir değişkene atarken bu ayrım hata almanın önüne geçer.

Sistemdeki alias’ları listelemek

Argümansız alias komutu, o oturumda tanımlı tüm alias'ları listeler:

[ec2-user@ip-10-0-47-213 ~]$ alias
alias egrep='egrep --color=auto'
alias eo='echo '\''ozcan bir değişkendir'\'''
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias xzegrep='xzegrep --color=auto'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep='xzgrep --color=auto'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'

Görüldüğü gibi dağıtım zaten bizim için bazı alias’ları hazır tanımlamış — ls yazdığımızda çıktının renkli gelmesinin sebebi de bu.

Günlük hayatta işe yarayan alias’lar

Her seferinde uzun uzun sudo apt-get update && sudo apt-get upgrade -y yazmak yerine:

alias update-this='sudo apt-get update && sudo apt-get upgrade -y'
alias myip='wget -qO- ifconfig.co'

Kubernetes ile çalışıyorsanız hayat kurtaran bir set:

alias kl='kubectl logs'
alias klf='kubectl logs -f'
alias kl1h='kubectl logs --since 1h'
alias kl1m='kubectl logs --since 1m'
alias kl1s='kubectl logs --since 1s'
alias klf1h='kubectl logs --since 1h -f'
alias klf1m='kubectl logs --since 1m -f'
alias klf1s='kubectl logs --since 1s -f'
alias kpf='kubectl port-forward'
alias krh='kubectl rollout history'
alias krsd='kubectl rollout status deployment'
alias krsss='kubectl rollout status statefulset'
alias kru='kubectl rollout undo'
alias ksd='kubectl scale deployment'
alias ksss='kubectl scale statefulset'
alias kgsw='kubectl get svc --watch'
alias kgswide='kubectl get svc -o wide'

Dosya listeleme için de klasikleşmiş kısayollar:

alias l='ls -lah'
alias la='ls -lAh'
alias ll='ls -lh'
alias lsa='ls -lah'
alias md='mkdir -p'
alias rd='rmdir'

Özetle

Alias, uzun komutları kendimize uygun ve akılda kalıcı kısayollara çevirmemizi sağlayan sistemdir. Ancak kritik bir detay var: terminal kapanıp açıldığında tanımladığınız alias’lar silinir. Kalıcı olması için ~/.bashrc dosyasına yazmak gerekir — yazının sonunda buna geleceğiz.

Variable — Değişken

Değişken, bir isme bir değer atama işlemidir. Değeri doğrudan kullanmak yerine değişkeni çağırırız.

Neden değişkene ihtiyaç duyarız?

Amaç, değişmeyen bir yapı kurup içindeki değişebilecek kısımları dışarıdan beslemektir. Örneğin bir script yazdınız; içine sabit değerler yerine değişkenler koyarsınız. Çalışma anında (runtime) o değişkenlere istediğiniz değeri verirsiniz. Böylece tek bir script’i her ortamda kullanabilirsiniz.

Tanımlama isim=değer şeklinde, çağırma ise $ işaretiyle yapılır:

[ec2-user@ip-10-0-47-213 ~]$ isim=ozcan
[ec2-user@ip-10-0-47-213 ~]$ echo $isim
ozcan
[ec2-user@ip-10-0-47-213 ~]$ isim=ozgur
[ec2-user@ip-10-0-47-213 ~]$ echo $isim
ozgur

Değişkeni $ ile çağırırken echo kullanmayı unutmayın. Doğrudan $key yazarsanız bash bunu bir komut sanır:

[ec2-user@ip-10-0-47-213 ~]$ key=value
[ec2-user@ip-10-0-47-213 ~]$ $key
-bash: value: command not found
[ec2-user@ip-10-0-47-213 ~]$ echo $key
value

Dikkat: Atama yaparken eşittir işaretinin etrafında boşluk olmamalı. merhaba = hello yazarsanız bash merhaba adında bir komut arar ve hata verir. Doğrusu merhaba=hello şeklindedir.

Environment Variable — Ortam Değişkeni ***

Normal bir variable tanımladığınızda o değişken sadece içinde bulunduğunuz session’da geçerlidir. Başka bir shell açtığınızda kaybolur.

Bir variable’ı environment variable’a çevirmek için **export **komutu kullanılır.

[ec2-user@ip-10-0-47-213 ~]$ export foo=bar

Farkı deneyerek görelim

Önce export olmadan deneyelim:

[ec2-user@ip-10-0-47-213 ~]$ merhaba=hello
[ec2-user@ip-10-0-47-213 ~]$ echo $merhaba
hello
[ec2-user@ip-10-0-47-213 ~]$ bash          # yeni bir bash session açıldı
[ec2-user@ip-10-0-47-213 ~]$ echo $merhaba
                                            # boş döndü
[ec2-user@ip-10-0-47-213 ~]$ exit           # bash session'dan çıkış
exit
[ec2-user@ip-10-0-47-213 ~]$ echo $merhaba
hello

Şimdi export ile aynı işlemi yapalım:

[ec2-user@ip-10-0-47-213 ~]$ export merhaba=hello
[ec2-user@ip-10-0-47-213 ~]$ bash
[ec2-user@ip-10-0-47-213 ~]$ echo $merhaba
hello

Peki aradaki fark tam olarak nedir?

Environment variable, export edilmiş değerlerdir. Bulunduğunuz shell'den başlatılan tüm alt (child) process'ler bu değişkeni miras alır.

Variable ise sadece o session’a bağlıdır. O session içinden yeni bir process başlatılırsa restart olursa, değişken child process’e taşınmaz.Kalıcı değildir silinir.Yedeklemek gerekir.

Yukarıdaki örnekte bash yazdığımızda mevcut shell'in altında child process olarak yeni bir shell açılmış oluyor. export edilmemiş merhaba değişkeni bu child'a geçmediği için boş döndü. exit ile parent shell'e döndüğümüzde değişken hâlâ yerinde duruyordu.

Environment variable’ları listelemek

printenv komutu sistemde tanımlı tüm environment variable'ları gösterir:

[ec2-user@ip-10-0-47-213 ~]$ printenv
SHELL=/bin/bash
merhaba=hello
HISTCONTROL=ignoredups
SYSTEMD_COLORS=false
HOSTNAME=ip-10-0-47-213.eu-west-1.compute.internal
HISTSIZE=1000
PWD=/home/ec2-user
LOGNAME=ec2-user
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/home/ec2-user
LANG=C.UTF-8

Sadece belirli bir değişkeni görmek isterseniz sonuna adını yazmanız yeterli:

[ec2-user@ip-10-0-47-213 ~]$ printenv PATH
/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Env Silme işlemi

unset komutu değişkeni siler:

[ec2-user@ip-10-0-47-213 ~]$ unset merhaba
[ec2-user@ip-10-0-47-213 ~]$ printenv merhaba
[ec2-user@ip-10-0-47-213 ~]$

Sık kullanılan environment variable’lar

Tüm environment variable’lar $ ile çağrılır:

[ec2-user@ip-10-0-47-213 ~]$ echo $USER
ec2-user
[ec2-user@ip-10-0-47-213 ~]$ cd /etc
[ec2-user@ip-10-0-47-213 etc]$ echo $PWD
/etc
[ec2-user@ip-10-0-47-213 etc]$ cd ~
[ec2-user@ip-10-0-47-213 ~]$ echo $PWD
/home/ec2-user
[ec2-user@ip-10-0-47-213 ~]$ echo $OSTYPE
linux-gnu
USER Oturum açan mevcut kullanıcı adı
SHELL Kullanıcıya atanmış shell (/bin/bash)
HOSTNAME Makinenin ağdaki adı
MAIL Posta kutusu konumu
PWD Bulunulan çalışma dizini
HOME Kullanıcının home dizini
PATH Komutların aranacağı dizinler
MANPATH man sayfalarının dizinleri
PS1 Komut istemi (prompt) biçimi
TERM Terminal tipi, renk desteği
DISPLAY X ekranı (sunucuda genellikle boştur)
LS_COLORS ls renk şeması
LANG Dil ve karakter kodlaması
TZ Saat dilimi (time zone)
EDITOR Varsayılan metin editörü
HISTFILESIZE Geçmiş dosyasının satır sınırı
OSTYPE İşletim sistemi tipi

PS1 — Prompt’u şekillendirmek ***

Terminalde gördüğümüz [ec2-user@ip-10-0-47-213 ~]$ satırının biçimini PS1 değişkeni belirler:

[ec2-user@ip-10-0-47-213 ~]$ echo $PS1
[\u@\h \W]\$

Buradaki \u kullanıcıyı, \h hostname'i, \W ise bulunulan dizini temsil eder. Prompt'u değiştirmek isterseniz:

[ec2-user@ip-10-0-47-213 ~]$ PS1="Hello WORLD $ "
Hello WORLD $

Daha şık ve renkli bir prompt kurmak isteyenler için detaylı kaynak: **cyberciti.biz — Linux/Unix Bash Shell Setup Prompt**

History Komutu

history, shell'de kullanılan tüm komutların kaydını tutar ve listelememizi sağlar.

[ec2-user@ip-10-0-47-213 ~]$ history
    1  history
    2  ls -al
    3  printenv

Kaç komutun saklanacağını HISTFILESIZE belirler — varsayılan olarak son 1000 komut tutulur:

[ec2-user@ip-10-0-47-213 ~]$ printenv HISTFILESIZE
1000

Komutlar home dizinindeki .bash_history dosyasında saklanır:

[ec2-user@ip-10-0-47-213 ~]$ ls -la
-rw-------  1 ec2-user ec2-user  1024 Aug 17 10:12 .bash_history
[ec2-user@ip-10-0-47-213 ~]$ cat .bash_history

History kısayolları

[ec2-user@ip-10-0-47-213 ~]$ !!        # en son çalıştırılan komutu tekrarlar
[ec2-user@ip-10-0-47-213 ~]$ !10       # history'deki 10. komutu tekrarlar
[ec2-user@ip-10-0-47-213 ~]$ !1        # history'deki 1. komutu tekrarlar
[ec2-user@ip-10-0-47-213 ~]$ !cat      # 'cat' ile başlayan en son komutu çalıştırır
[ec2-user@ip-10-0-47-213 ~]$ !echo     # 'echo' ile başlayan en son komutu çalıştırır

Ctrl + R kombinasyonu ile de history içinde interaktif arama yapabilirsiniz.

Security notu

History hafızada tutulur ve çıkışta diske yazılır. Yani terminale girdiğiniz her şey kaydediliyor — şifreler, token’lar, API key’ler dahil. Bu ciddi bir güvenlik açığına yol açabilir, dolayısıyla hassas bilgilerle çalışırken dikkatli olmak gerekir.

Tüm geçmişi temizlemek için:

[ec2-user@ip-10-0-47-213 ~]$ history -c

Komutları history’ye kaydettirmemek

HISTCONTROL değişkeni bu davranışı kontrol eder. ignorespace değeri verildiğinde, başında boşluk bırakarak yazdığınız komutlar geçmişe kaydedilmez:

[ec2-user@ip-10-0-47-213 ~]$ printenv HISTCONTROL
ignoredups
[ec2-user@ip-10-0-47-213 ~]$ export HISTCONTROL=ignorespace
[ec2-user@ip-10-0-47-213 ~]$  echo "deneme"
deneme
[ec2-user@ip-10-0-47-213 ~]$ history
    1  history
    2  ls -al
    3  history
    4  printenv HISTCONTROL

echo "deneme" komutunun listede olmadığına dikkat edin — çünkü başında bir boşluk bırakılmıştı.

İkisini birden (hem tekrar edenleri hem boşlukla başlayanları) yok saymak için:

export HISTCONTROL=ignoreboth

Not: export ile verdiğiniz değer sadece o oturumda geçerlidir. Terminali kapatıp açtığınızda varsayılana döner. Kalıcı olması için ~/.bashrc dosyasına yazılmalıdır:

echo 'export HISTCONTROL=ignoreboth' >> ~/.bashrc
source ~/.bashrc

Diğer faydalı ayarlar:

# Belirli komutları kalıcı olarak geçmişten hariç tut
export HISTIGNORE="ls:ll:history:pwd:clear"
# O oturumda geçmiş kaydını tamamen kapat
set +o history
set -o history      # geri aç
# Oturum boyunca hiçbir şey diske yazılmasın
unset HISTFILE

Shell Türleri: Interactive ve Non-Interactive

Buraya kadar tanımladığımız her şeyin (alias, variable, history ayarları) terminali kapatınca kaybolduğunu söyledik. Bunun sebebini anlamak için shell’in nasıl başladığına bakmamız gerekiyor.

Home directory dizinimizi listelediğimizde karşımıza dört dosya çıkar:

[ec2-user@ip-10-0-47-213 ~]$ ls -la
.bash_history
.bash_logout
.bash_profile
.bashrc

Bu dosyalardan hangisinin okunacağı, shell’i nasıl başlattığınıza bağlıdır.

Shell üzerinde işlem yapmanın iki yöntemi vardır:

1- Interactive mod

Terminal aracılığıyla shell’e bağlanıp komutları tek tek yazarsınız. Prompt görünür.

Interactive bağlanmanın da kendi içinde iki çeşidi var:

a. Login shell: SSH ile bağlanma, tty, su - veya doğrudan login ile giriş. EC2 makinenize SSH ile bağlandığınızda açılan shell budur.

b. Non-login shell: Zaten bir shell içindeyken bash yazarak yeni bir session açmanız. Mevcut shell'in altında child process olarak ikinci bir session açılır, exit ile çıkılır. Yani login olmadan bağlanma yöntemidir.

2-Non-interactive mod

Bir script çalıştırırsınız (./deneme.sh gibi), komutlar dosyadan okunur. Kullanıcı yoktur.

Hangi durumda hangi dosya okunur?

Login shell açıldığında sırasıyla /etc/profile ve ardından ~/.bash_profile okunur. ~/.bash_profile yoksa ~/.bash_login, o da yoksa ~/.profile denenir — bu üç dosyadan sadece ilki okunur.

Non-login shell açıldığında ise ~/.bashrc çalışır (Debian/Ubuntu'da öncesinde sistem geneli /etc/bash.bashrc de okunur).

Non-interactive (script) çalıştırdığınızda hiçbir başlangıç dosyası okunmaz. Bu yüzden script içinde tanımladığınız alias’lar çalışmaz ve PATH beklediğiniz gibi olmayabilir.

Peki iki dosyayı da yönetmek zorunda mıyız?

Hayır. Çoğu dağıtım bu problemi zaten çözmüş: ~/.bash_profile içinde ~/.bashrc'yi çağıran bir blok bulunur.

[ec2-user@ip-10-0-47-213 ~]$ cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
# User specific environment and startup programs

Yani login shell açıldığında ~/.bash_profile okunur, o da içeriden ~/.bashrc'yi yükler. Sonuç olarak ~/.bash_profile'ı unutup her şeyi ~/.bashrc içine yazabiliriz.

~/.bashrc dosyasının içinde ise fonksiyonlar tanımlanır, environment variable'lar export edilir:

[ec2-user@ip-10-0-47-213 ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
    PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
    for rc in ~/.bashrc.d/*; do
        if [ -f "$rc" ]; then
            . "$rc"
        fi
    done
fi

Çok önemli not

Bir environment variable’ı export ile oluşturursanız sadece o session'da geçerli olur; makine restart edilince kaybolur. Her login olunduğunda kalıcı olarak çalışmasını istiyorsanız ~/.bashrc dosyasının içine yazmalısınız.

Yani şunun yerine:

export hello=world

Şunu yapmalısınız:

nano ~/.bashrc
# dosyanın sonuna: export hello=world
source ~/.bashrc

Böylece sistem yeniden başlasa bile değişkeniniz yerinde durur. Aynı kural alias’lar için de geçerlidir.

Kontrol komutları

Hangi tür shell’de olduğunuzu merak ederseniz:

echo $0     # -bash → login shell, bash → non-login shell
echo $-     # çıktıda 'i' varsa interactive

Ayrıca ~/.bash_logout dosyası da vardır; içeriği sadece login shell kapanırken çalışır.

Ubuntu Tarafında: .zshrc

Ubuntu (veya WSL) kullanıyorsanız home dizininde .zsh uzantılı dosyalar da görebilirsiniz:

.zsh_history
.zshrc
.zshrc.pre-oh-my-zsh

Mantık bash ile aynıdır, sadece dosya adı değişir. .zshrc içinden bir kesit:

# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
alias update-this="sudo apt-get update && sudo apt-get upgrade -y"
alias myip="wget -qO- ifconfig.co"
alias cat="batcat"
# Path to your oh-my-zsh installation.
export ZSH="$HOME/.oh-my-zsh"
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Set name of the theme to load
ZSH_THEME="powerlevel10k/powerlevel10k"

Buradaki alias cat="batcat" satırı güzel bir örnek: cat komutunu bat ile değiştirerek terminalde syntax highlighting'li, satır numaralı bir çıktı elde ediyorsunuz.

Sonuç

Özetleyecek olursak:

  • Alias, uzun komutları kısaltır ama session sonunda silinir.
  • Variable, sadece bulunduğunuz session’da geçerlidir.
  • Environment variable, export ile oluşturulur ve child process'lere miras kalır.
  • History, tüm komutlarınızı kaydeder — güvenlik açısından dikkatli kullanılmalı.
  • Bunların hepsinin kalıcı olması için ~/.bashrc dosyasına yazılması gerekir.

Pratikteki altın kural şu: her şeyi ~/.bashrc içine yazın, ~/.bash_profile içine de sadece şu satır ekli olduğuna emin olun:

[ -f ~/.bashrc ] && . ~/.bashrc

Böylece login shell de non-login shell de aynı ayarlarla açılır.


메타데이터
post_id
2103acffb7f8
slug
linux-kullanıcı-yönetimi-shell-türleri-interactive-non-interactiv-ve-alias-variable-2103acffb7f8
url
https://medium.com/@ozcankaraa/linux-kullan%C4%B1c%C4%B1-y%C3%B6netimi-shell-t%C3%BCrleri-interactive-non-interactiv-ve-alias-variable-2103acffb7f8
canonical_url
https://medium.com/@ozcankaraa/linux-kullan%C4%B1c%C4%B1-y%C3%B6netimi-shell-t%C3%BCrleri-interactive-non-interactiv-ve-alias-variable-2103acffb7f8
author_url
https://medium.com/@ozcankaraa
status
ok
fetched_at
2026-09-10 16:46:59