Bash'te komut satırını düzenleyen klavye kısayolları GNU Readline kütüphanesinden gelir. En çok kullanılanlar şunlardır: Ctrl-A satır başına, Ctrl-E satır sonuna gider; Ctrl-W imleçten geriye doğru bir kelimeyi, Ctrl-U satır başına kadar olan kısmı, Ctrl-K satır sonuna kadar olan kısmı keser; Ctrl-Y kesileni geri yapıştırır; Ctrl-R komut geçmişinde arar; Tab tamamlar. Bu tuşlar varsayılan emacs kipine aittir; set -o vi ile vi kipine geçebilir, ~/.inputrc dosyası ya da bind komutuyla kendi tuş bağlarınızı tanımlayabilirsiniz.
Bu yazıda tuş gösteriminin nasıl okunduğunu, hareket, kesme ve yapıştırma, geçmiş ve tamamlama komutlarını, sayısal argümanları, ~/.inputrc sözdizimini, en yararlı Readline değişkenlerini, bind komutunu ve programlanabilir tamamlamaya kısa bir girişi göreceksiniz. Kısayollar etkileşimli kabukta çalıştığı için çoğunu bir tuş dizisi olarak anlatıyoruz; çalıştırılabilen kısımları (bind sorguları, complete ve compgen) gerçek çıktılarıyla gösteriyoruz. Kaynak, GNU Bash Reference Manual'ın 8. bölümü (Command Line Editing).
Tuş gösterimi: C-, M- ve ESC
Kılavuz tuşları emacs geleneğiyle yazar. C-k, Control tuşu basılıyken k tuşuna basmak demektir; bu yazıda Ctrl-K olarak da görürsünüz. M-k ise Meta tuşuyla birlikte k demektir; çoğu klavyede Meta tuşu Alt (Mac klavyelerinde Option) olarak etiketlidir. Meta tuşunuz yoksa ya da terminaliniz onu iletmiyorsa aynı etkiyi önce ESC tuşuna basıp bırakarak, ardından k tuşuna basarak elde edersiniz; buna meta öneki denir. M-C-k ise C-k karakterinin meta hali, yani Alt ile Ctrl birlikte basılıyken k demektir. DEL, ESC, RET, SPC ve TAB kendi tuşlarını gösterir.
Kılavuzun gevşek bir kuralı akılda tutmayı kolaylaştırır: Control ile basılan tuşlar genellikle karakter üzerinde, Meta ile basılanlar kelime üzerinde çalışır. C-f bir karakter, M-f bir kelime ileri gider; C-d bir karakter, M-d bir kelime siler.
Hareket ve düzenleme kısayolları

| Tuş | Readline komutu | Etkisi |
|---|---|---|
| Ctrl-A / Ctrl-E | beginning-of-line / end-of-line | satır başına / sonuna git |
| Ctrl-B / Ctrl-F | backward-char / forward-char | bir karakter geri / ileri |
| Alt-B / Alt-F | backward-word / forward-word | bir kelime geri / ileri |
| Ctrl-L | clear-screen | ekranı temizle, satırı en üste yeniden çiz |
| Ctrl-D | delete-char | imleçteki karakteri sil (boş satırda dosya sonu demektir) |
| Ctrl-T / Alt-T | transpose-chars / transpose-words | iki karakterin / kelimenin yerini değiştir |
| Alt-U / Alt-L / Alt-C | upcase-word / downcase-word / capitalize-word | kelimeyi büyük harf / küçük harf / baş harfi büyük yap |
| Ctrl-_ veya Ctrl-X Ctrl-U | undo | son düzenlemeyi geri al |
| Alt-R | revert-line | satırdaki tüm değişiklikleri geri al |
| Ctrl-V veya Ctrl-Q | quoted-insert | bir sonraki tuşu olduğu gibi ekle |
| Alt-# | insert-comment | satırın başına # koyup satırı kabul et |
Satırı kabul etmek için imlecin sonda olması gerekmez: Enter tuşu, imleç nerede olursa olsun satırın tamamını gönderir. Uzun bir komutun başındaki bir yazım hatasını düzeltmek için Ctrl-A ile başa gidip düzeltin ve doğrudan Enter tuşuna basın. Alt-# özellikle kullanışlıdır: yarım kalmış bir komutu silmek yerine yorum olarak geçmişe kaydeder, sonra geçmişten geri çağırıp tamamlayabilirsiniz. Geçmişin nasıl tutulduğu Bash history komut geçmişi yazısında.
Kesme ve yapıştırma: kill ring
Readline'da "kesmek" (kill) metni satırdan silip bir kenara kaydetmek, "yapıştırmak" (yank) ise en son kesileni imlecin olduğu yere geri koymaktır. Kesilen metinler bir kill ring içinde tutulur; art arda yapılan kesmeler tek bir parça olarak birleşir ve halka satıra özgü değildir: bir önceki satırda kestiğiniz metni yeni satırda yapıştırabilirsiniz.
| Tuş | Readline komutu | Etkisi |
|---|---|---|
| Ctrl-K | kill-line | imleçten satır sonuna kadar kes |
| Ctrl-U | unix-line-discard | imleçten satır başına kadar kes |
| Alt-D | kill-word | imleçten kelime sonuna kadar kes |
| Alt-DEL (Alt-Backspace) | backward-kill-word | imleçten kelime başına kadar kes |
| Ctrl-W | unix-word-rubout | imleçten bir önceki boşluğa kadar kes |
| Ctrl-Y | yank | en son kesileni yapıştır |
| Alt-Y | yank-pop | halkayı döndür, bir öncekini yapıştır (yalnızca Ctrl-Y sonrası) |
Ctrl-W ile Alt-DEL arasındaki fark kelime sınırıdır. Ctrl-W yalnızca boşluğu sınır sayar; Alt-DEL ise harf ve rakamlardan oluşan kelimeleri esas alır. Satırın sonunda /var/www/site/index.html yazılıyken Ctrl-W yolun tamamını keser, Alt-DEL ise yalnızca html kısmını keser. Yolda bir dizin geri gitmek istiyorsanız ikincisi, yolu tümden silmek istiyorsanız birincisi işinize yarar.
Sayısal argümanlar
Readline komutlarının çoğu sayısal bir argüman alır. Argüman bazen tekrar sayısıdır, bazen yalnızca işareti önemlidir: normalde ileriye çalışan bir komuta negatif argüman verirseniz geriye çalışır. Argümanı Meta ile basılan rakamlarla verirsiniz. Örneğin Alt-1 0 Ctrl-D imleçten sonraki on karakteri siler; Alt-- Ctrl-K ise Ctrl-K komutunu ters çevirip satır başına kadar keser. İlk rakamdan sonra kalan rakamları Meta olmadan yazabilirsiniz.
Geçmişte gezinme ve arama

| Tuş | Readline komutu | Etkisi |
|---|---|---|
| Ctrl-P / Ctrl-N (yukarı / aşağı ok) | previous-history / next-history | önceki / sonraki komut |
| Alt-< / Alt-> | beginning-of-history / end-of-history | geçmişin başına / o an yazılan satıra |
| Ctrl-R / Ctrl-S | reverse-search-history / forward-search-history | artımlı geri / ileri arama |
| Alt-P / Alt-N | non-incremental-...-search-history | metni tamamen yazdıktan sonra arama |
| Alt-. veya Alt-_ | yank-last-arg | önceki komutun son argümanını ekle; tekrarla daha eskilere git |
| Ctrl-O | operate-and-get-next | satırı çalıştır ve geçmişte sonraki satırı getir |
| bağlı değil | history-search-backward | satır başından imlece kadar olan metinle başlayan komutu ara |
Tablodaki Alt-< ve Alt-> hücreleri küçüktür ve büyüktür işaretleriyle basılan tuşlardır. Ctrl-R artımlı aramadır: yazdığınız her karakterle eşleşen en yakın eski komut gösterilir. Aynı metinle bir önceki eşleşmeye gitmek için yeniden Ctrl-R basarsınız; Enter bulunan komutu çalıştırır; bir hareket tuşu aramayı bitirip satırı düzenlemeye açar; Ctrl-G aramayı iptal edip eski satıra döner. isearch-terminators değişkeni ayarlı değilse ESC ve Ctrl-J da aramayı bitirir. Readline son arama metnini hatırlar; arada başka karakter yazmadan iki kez Ctrl-R basarsanız önceki aranan metin yeniden kullanılır.
Ctrl-O, geçmişteki bir dizi komutu sırayla yeniden çalıştırmanın kısa yoludur: Ctrl-R ile dizinin ilk komutunu bulun, sonra her seferinde Ctrl-O basın. Her basış o satırı çalıştırır ve geçmişte ondan sonra gelen satırı düzenlemeye getirir.
Tab tamamlama nasıl karar verir?
Tab tuşu complete komutuna bağlıdır. Kılavuza göre Bash önce komut için tanımlanmış bir programlanabilir tamamlama olup olmadığına bakar. Yoksa imlecin önündeki metni sırayla şöyle yorumlar: $ ile başlıyorsa değişken adı, ~ ile başlıyorsa kullanıcı adı, @ ile başlıyorsa makine adı, aksi halde komut adı (alias, fonksiyon ve yerleşik komutlar dahil). Bunların hiçbiri eşleşme üretmezse dosya adı tamamlamasına düşer. Birden fazla olasılık varsa ilk Tab ortak öneki tamamlar ve zil çalar, ikinci Tab olasılıkları listeler.
| Tuş | Readline komutu | Etkisi |
|---|---|---|
| Tab | complete | tamamlamayı dene |
| Alt-? | possible-completions | olası tamamlamaları listele |
| Alt-* | insert-completions | tüm olasılıkları boşlukla ayırıp satıra ekle |
| Alt-/ ve Ctrl-X / | complete-filename ve listesi | metni dosya adı olarak tamamla |
| Alt-$ ve Ctrl-X $ | complete-variable ve listesi | metni değişken adı olarak tamamla |
| Alt-! ve Ctrl-X ! | complete-command ve listesi | metni komut adı olarak tamamla |
| Alt-Tab | dynamic-complete-history | geçmişteki satırlara göre tamamla |
| Alt-{ | complete-into-braces | dosya adı olasılıklarını süslü parantez içinde ekle |
| bağlı değil | menu-complete | her basışta sıradaki tek olasılığı yerleştir |
menu-complete varsayılan olarak bir tuşa bağlı değildir, ama kılavuzun da belirttiği gibi Tab tuşuna bağlanmak üzere tasarlanmıştır: her basışta listeyi tek tek dolaşır, sona gelince zil çalıp özgün metne döner. complete-into-braces çıktısı, kabuğun süslü parantez genişletmesiyle tekrar açılabilecek bir biçimdedir; bunun kuralları brace expansion ve tilde yazısında.
~/.inputrc ile kalıcı ayarlar
Readline başlarken bir başlangıç dosyası okur. Dosyanın adı INPUTRC değişkeninden alınır; değişken ayarlı değilse ~/.inputrc kullanılır, o da yoksa ya da okunamıyorsa /etc/inputrc aranır. Dosyayı düzenledikten sonra kabuğu kapatmadan Ctrl-X Ctrl-R ile yeniden okutabilirsiniz. Readline'ı başka programlar da kullandığı için bu dosyadaki ayarlar yalnızca Bash'i değil, Readline kullanan diğer etkileşimli araçları da etkiler.
Sözdizimi birkaç yapıdan ibarettir. Boş satırlar yok sayılır, # ile başlayan satırlar yorumdur, $ ile başlayan satırlar koşul yapılarıdır. Değişkenler set değişken değer ile ayarlanır; adlar ve değerler büyük küçük harfe duyarsızdır, tanınmayan değişken adları yok sayılır. Açık kapalı türündeki değişkenler değer boşsa, on ya da 1 ise açılır; başka her değer kapatır. Tuş bağı ise tuş: komut biçimindedir ve tuş adıyla iki nokta arasında boşluk olmamalıdır, aksi halde boşluk tuş adının parçası sayılır:
# ~/.inputrc
# Önce sistem genelindeki ayarları al
$include /etc/inputrc
# Tamamlamada büyük küçük harf ayrımı yapma, belirsizlikte hemen listele
set completion-ignore-case on
set show-all-if-ambiguous on
# Dizinlere bağlı sembolik bağlantılara da / ekle
set mark-symlinked-directories on
# Yukarı ve aşağı ok: satırın başındaki metinle başlayan komutları ara
"\e[A": history-search-backward
"\e[B": history-search-forward
# Makro: Ctrl-X q imleçteki kelimeyi çift tırnak içine al
$if Bash
"\C-xq": "\eb\"\ef\""
$endifTuş dizisi çift tırnak içinde yazıldığında \C- Control önekini, \M- Meta önekini, \e escape karakterini gösterir; tırnaksız yazımda Control-u ya da Meta-Rubout gibi İngilizce adlar kullanılır. Sağ taraf tırnaksızsa bir Readline komutunun adıdır, tırnaklıysa tuşa basıldığında satıra eklenecek bir makrodur. Örnekteki ok tuşu dizileri \e[A ve \e[B birçok terminalin yukarı ve aşağı ok için gönderdiği dizilerdir; kendi terminalinizin gönderdiği diziyi Ctrl-V ardından ilgili tuşa basarak görebilirsiniz.
$if yapısı ayarları koşula bağlar: $if mode=emacs düzenleme kipini, $if term=xterm terminal türünü (kısa çizgiden önceki kısım da eşleşir, yani xterm-256color da tutar), $if version >= 7.0 Readline sürümünü, $if Bash ise Readline'ı kullanan programın adını sınar. $if editing-mode == emacs biçiminde bir Readline değişkeninin değeri de sınanabilir. $else ve $endif yapıyı tamamlar, $include başka bir dosyayı okutur.
| Değişken | Etkisi | Varsayılan |
|---|---|---|
| editing-mode | emacs ya da vi tuş takımı | emacs |
| completion-ignore-case | dosya adı tamamlamada harf büyüklüğünü yok say | off |
| show-all-if-ambiguous | birden çok olasılıkta zil yerine hemen listele | off |
| completion-query-items | bu sayıdan çok olasılıkta listelemeden önce sor | 100 |
| mark-symlinked-directories | dizine bağlı sembolik bağlantıya / ekle | off |
| colored-stats | olasılıkları LS_COLORS renkleriyle göster | off |
| bell-style | zil: none, visible ya da audible | audible |
| enable-bracketed-paste | yapıştırılan metni tek parça olarak ekle | On |
| search-ignore-case | geçmiş aramalarında harf büyüklüğünü yok say | off |
| show-mode-in-prompt | istemin başında düzenleme kipini göster | off |
enable-bracketed-paste açıkken terminale yapıştırdığınız metin tek bir karakter dizisi olarak eklenir; metnin içindeki satır sonları ya da tuş dizileri düzenleme komutu gibi yorumlanmaz. Bir web sayfasından kopyaladığınız çok satırlı bir komutun siz Enter tuşuna basmadan çalışmasını önleyen davranış budur. İstemdeki kip göstergesinin ayrıntıları PS1 prompt özelleştirme yazısında.
bind komutu: bağları sorgulamak ve değiştirmek
bind yerleşik komutu, ~/.inputrc dosyasına yazacağınız her şeyi çalışan kabukta yapmanızı sağlar. Her bağ, başlangıç dosyasındaki gibi yazılır ama tek bir argüman olarak verilmelidir; bu yüzden genellikle tek tırnak içine alınır. En kullanışlı seçenekler şunlardır:
bind -q komut: bir Readline komutuna hangi tuşların bağlı olduğunu gösterir.bind -pvebind -P: tüm komut bağlarını, birincisi~/.inputrcbiçiminde, ikincisi okunur biçimde listeler.bind -vvebind -V: Readline değişkenlerini ve değerlerini aynı iki biçimde listeler.bind -l: tüm Readline komutlarının adlarını listeler.bind -x 'tuş: kabuk komutu': tuşa bir Readline komutu değil, bir kabuk komutu bağlar;bind -Xbu bağları listeler.bind -r tuş,bind -u komut,bind -f dosya: bağı kaldırır, komutun bütün bağlarını kaldırır, bağları bir dosyadan okur.
bind yalnızca satır düzenleme açıkken anlamlıdır. Aşağıdaki deneme etkileşimli bir kabuğu -i ile başlatıyor, sistemin /etc/inputrc dosyası karışmasın diye INPUTRC değerini /dev/null yapıyor ve komutları bir dosyadan okutuyor:
printf '%s\n' "PS1='\$ '" > ./rl_rc
cat > ./rl_girdi.txt <<'SON'
bind -q kill-line
bind -q reverse-search-history
bind -q unix-word-rubout
bind -q yank-last-arg
bind -q edit-and-execute-command
bind -v | grep -e show-all-if-ambiguous -e editing-mode
bind -x '"\C-xt": echo merhaba'
bind -X
set -o vi
bind -v | grep editing-mode
SON
INPUTRC=/dev/null bash --rcfile ./rl_rc -i < ./rl_girdi.txt 2>&1 | grep -v -e 'process group' -e 'job control' -e '^\$ '
# çıktı:
# kill-line can be invoked via "\C-k".
# reverse-search-history can be invoked via "\C-r".
# unix-word-rubout can be invoked via "\C-w".
# yank-last-arg can be invoked via "\e.", "\e_".
# edit-and-execute-command can be invoked via "\C-x\C-e".
# set show-all-if-ambiguous off
# set editing-mode emacs
# "\C-xt": "echo merhaba"
# set editing-mode viÇıktıdaki \e. gösterimi Alt-. tuşunun meta önekli halidir. bind -x ile bağlanan komut çalışırken Bash, satırın içeriğini READLINE_LINE, imlecin konumunu READLINE_POINT değişkenine koyar; komut bu değişkenleri değiştirirse satır da değişir. Böylece satırı kabuk koduyla işleyen kendi kısayollarınızı yazabilirsiniz. Aynı bind komutunu bir betik içinde çalıştırırsanız kabuk bind: warning: line editing not enabled uyarısı verir, çünkü betik satır düzenleme kullanmaz.
vi kipi
Readline'ın vi kipi tam bir vi değildir, ama satır düzenlemeye yetecek kadar komut içerir ve POSIX standardındaki sh tanımına uyar. set -o vi ile vi kipine, set -o emacs ile varsayılan kipe dönersiniz; kalıcı tercih için ~/.inputrc içine set editing-mode vi yazabilirsiniz. Her yeni satıra ekleme kipinde başlarsınız; ESC komut kipine geçirir. Komut kipinde vi'ın hareket tuşları çalışır, k önceki ve j sonraki geçmiş satırını getirir. Kipi istemde görmek için show-mode-in-prompt değişkenini açabilirsiniz.
Programlanabilir tamamlama: complete ve compgen
Kendi betiğiniz ya da aracınız için Tab tamamlaması tanımlayabilirsiniz. complete yerleşik komutu bir komut adına bir tamamlama tanımı (compspec) bağlar; compgen aynı kurallarla olasılık üretip ekrana yazar ve tanımları denemek için idealdir. -W sabit bir kelime listesi verir, -F olasılıkları COMPREPLY dizisine yazan bir fonksiyon çağırır. Fonksiyon çalışırken Bash satırın kelimelerini COMP_WORDS dizisine, tamamlanan kelimenin sırasını COMP_CWORD değişkenine koyar. Bunların çoğu betik içinde de çalışır:
compgen -W "start stop status restart" -- st
# çıktı:
# start
# stop
# status
_servis_tamamla() {
local kelime=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "start stop status restart" -- "$kelime") )
}
complete -F _servis_tamamla servisim
complete -p servisim # çıktı: complete -F _servis_tamamla servisim
# Tab tuşuna basılmış gibi fonksiyonu elle deneyelim
COMP_WORDS=(servisim sta); COMP_CWORD=1
_servis_tamamla
printf '%s\n' "${COMPREPLY[@]}"
# çıktı:
# start
# status
compgen -v -- BASH_VERS
# çıktı:
# BASH_VERSINFO
# BASH_VERSIONEtkileşimli kabukta bu tanımdan sonra servisim sta yazıp Tab tuşuna basmak, start ve status olasılıklarını getirir. Tanımı kalıcı yapmak için fonksiyonu ve complete satırını ~/.bashrc dosyanıza koyun; bkz. .bashrc ve .bash_profile farkı. Dizilerle çalışmanın ayrıntıları Bash dizi kullanımı yazısında. Bir compspec bulunduğunda Bash'in varsayılan tamamlamaları kapanır; olasılık üretilemediğinde dosya adı tamamlamasına dönmek için tanıma -o default, Bash'in varsayılanlarına dönmek için -o bashdefault eklenir.
Birkaç az bilinen ama çok işe yarayan komut

Ctrl-X Ctrl-E(edit-and-execute-command): satırı bir düzenleyicide açar; kaydedip çıktığınızda sonuç kabuk komutları olarak çalışır. Bash sırasıyla$VISUAL,$EDITORveemacsdüzenleyicilerini dener. Uzun bir tek satırlık komutu düzenlemenin en rahat yoludur.Alt-Ctrl-E(shell-expand-line): satırdaki alias, geçmiş, değişken, komut ikamesi gibi genişletmeleri çalıştırmadan yerinde açar; bir komutun gerçekte ne çalıştıracağını görmek için kullanışlıdır.Alt-^(history-expand-line): yalnızca!!gibi geçmiş genişletmelerini satırda açar.Ctrl-X *(glob-expand-word): imleçteki joker deseni eşleşen dosya adlarıyla değiştirir; desenlerin kuralları joker karakterler ve glob yazısında.Ctrl-X (,Ctrl-X )veCtrl-X e: klavye makrosu kaydetmeye başlar, kaydı bitirir ve son makroyu yeniden oynatır.
Sık yapılan hatalar
- inputrc içinde tuş adıyla iki nokta arasına boşluk koymak:
"\C-xq" : komutbiçimi çalışmaz; boşluk tuş adına dahil olur. - Makroyu tırnaksız yazmak: sağ taraf tırnaksızsa Readline onu bir komut adı sanar; eklenecek metni tırnak içine alın.
- Betikte bind kullanmak: satır düzenleme kapalı olduğu için uyarı verir ve bir şey değiştirmez. Bağları
~/.inputrcya da~/.bashrciçine koyun. - Ctrl-S ile ileri aramanın çalışmaması: terminal sürücüsü bazı kontrol karakterlerini kendisi işleyebilir. Readline'ın
bind-tty-special-charsdeğişkeni bu karakterleri Readline karşılıklarına bağlamaya çalışır; terminalinizin özel karakterlerinistty -aile görebilirsiniz. - Değişiklikten sonra dosyayı yeniden okutmamak:
~/.inputrcdeğişikliği açık kabukta ancakCtrl-X Ctrl-Rya dabind -f ~/.inputrcile etkili olur.
Sık Sorulan Sorular
Yukarı ok tuşunun yalnızca yazdığım metinle başlayan komutları getirmesini nasıl sağlarım?
history-search-backward ve history-search-forward komutlarını ok tuşlarının dizilerine bağlayın; yukarıdaki ~/.inputrc örneğinde olduğu gibi. Bu komutlar varsayılan olarak bağlı değildir ve satır başından imlece kadar olan metinle başlayan geçmiş satırlarını arar.
Kesip yapıştırdığım metin işletim sisteminin panosuna gider mi?
Hayır. Readline'ın kill ring halkası kendi içindedir ve yalnızca o Readline oturumunda kullanılır. Terminalinizin kopyala yapıştır işlevi ayrı bir mekanizmadır.
Hangi tuşların neye bağlı olduğunu nasıl görürüm?
Etkileşimli kabukta bind -P tüm bağları okunur biçimde, bind -q komut tek bir komutun tuşlarını gösterir. Değişkenlerin değerleri için bind -V kullanın.
Tamamlamada büyük küçük harf ayrımını nasıl kapatırım?
~/.inputrc dosyasına set completion-ignore-case on satırını ekleyin. Kısa çizgi ile alt çizgiyi de eşdeğer saymak isterseniz completion-map-case değişkenini de açabilirsiniz; bu yalnızca harf ayrımı kapalıyken etkilidir.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Bash öğrenme rehberi · komut geçmişi · PS1 özelleştirme · .bashrc ve .bash_profile · alias tanımlama · arka plan işleri · tmux ve screen · SSH ile bağlanma