Bash kullanarak en sevdiğiniz tek komut satırı hileniz nedir? [kapalı]


156

<ctrl>-RGeçmişte geriye doğru arama yapmak için nasıl kullanılacağını hepimiz biliyoruz , ancak <ctrl>-Sbelirlediyseniz aramayı yönlendirmek için kullanabileceğinizi biliyor muydunuz stty stop ""? Ayrıca, tüm klavye kısayollarınızı görmek için bind -p komutunu çalıştırmayı hiç denediniz mi? Mac OS X'te varsayılan olarak 455'den fazla vardır.

En sevdiğiniz tek gizli numara, klavye kısayolu veya bash kullanarak shopt yapılandırmanız nedir?


2
Lütfen bunu "En sevdiğin tek hangisi" demek için yeniden yaz. Bu, insanların neredeyse bir anket gibi belirli cevapları oylamalarına izin verir.
SCdF

> Lütfen bunu "En sevdiğin en sevdiğin nedir?" Bitti.
Martin Klinke

1
Bu soru için bir StackOverflow klonu var: commandlinefu.com
rkb

Bu 455 varsayılan anahtar bağlantısından yalnızca 232 tanesi "kendi kendine ekleme" ("bu anahtarı yazın") dışında bir şey yapar: $ bind -p | grep -v kendi kendine ekleme | wc
Ed Brannin

Burada bazı temiz şeyler. Ancak, bunlardan birkaçının sadece bash emacs modundayken çalıştığı belirtilmelidir ...
Mo.

Yanıtlar:


157

Sonekleri olan dosyaları hızlı bir şekilde yeniden adlandırma / taşıma:
cp /home/foo/realllylongname.cpp{,-old}

Bu, aşağıdakilere genişler:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old


12
Müthiş! Şimdi bunu hatırlamaya çalışmalıyım.
Jon Ericson

9
Sadece bunun tersini yapmak için (.cpp-old'tan .cpp'e gitmek) cp /home/foo/realllylongname.cpp{-old,}
Michael Ekoka

Geçmişe bakıldığında çok açık ve yine de bunu kendi başıma yapmayı hatırlayacağımı sanmıyorum. Teşekkürler!
Zecc

150
cd -

Geri düğmesinin komut satırı eşdeğeri (sizi bulunduğunuz dizine götürür).


6
Kendimi bir dizin yığını kullanmayı pushdve popdkorumayı tercih ediyorum.
Alex M

21
Ancak 'cd -', pushd kullanmayı hatırlamasanız bile çalışmanın avantajına sahiptir.
Sergio Acosta

10
'Cd'nin sizi ana dizininize götürdüğünü belirtmek gerekir.
dr-jan

Bunun man cdya da cd --help(en azından benim) görünmemesi ilginç .
Halil Özgür

135

Başka bir favori:

!!

Son komutunuzu tekrarlar. Formda en yararlı olanı:

sudo !!

81
bu konuda sizi çok kızdırmak gibi bir avantajı da var. "Bilgisayar, bunu yap." "Erişim reddedildi". "YAP!!"
nickf

Bu az bilinen bir şey değil! :-)
hoyhoy

10
Benzer şeyler yapabilirsiniz: mkdir testdir; cd !$.. Bu çalışır cd [last word of previous line](örnekte cd testdir)
dbr

13
Bana bir sandviç Sudo yap !!
Kibbee

!!,! $ Ve! -1: ^ foo ^ bar'dan hoşlanıyorsanız, "Space: magic-space" i de bağlayacaksınız. stackoverflow.com/questions/603696/…
Yoo

81

En sevdiğim, son komutu alan, dizeyi string2 ile değiştiren ve yürüten '^ string ^ string2'.

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Bash komut satırı geçmişi kılavuzu


Bu açgözlü değil. Nasıl açgözlü yapabilirim?
Altreus

9
!!:gs/ehco/echo/
andre-r

Bu kılavuzun 2. sayfası esastır
jmoz

1
@ Andre-r: !!:gs/ehco/echo/gerçekleştirir (kazandırır geçen komut üzerine bir genel arama ve değiştirme !!bölgesindeki stackoverflow.com/questions/68372/... ). Bu ^ehco^echosadece bir "ehco" örneğinin yerini alan eşdeğer değildir - daha doğru bir yanıt olacaktır !!:s/ehco/scho.
Iceland_jack

64

Adını değiştirmek

Misal:

$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt

$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt

Çok kullanışlı


3
Vay be, tüm bu yıllar boyunca basename, mv ve {} hileleri kullanarak bir salak oldum. / foreheadsmack.
Gregg Lind

7
Ancak rename bash / readline gibi diğer yayınlar gibi değil.
silahlar

1
Zsh dağıtımından zmv çoğu durumda çok daha iyidir.
ZyX

util-linux-ng'nin de bir yeniden adlandırma komutu vardır ve bu cevapta belirtilene benzemez. Burada açıklanan komut aslında mmv'dir .
Cristian Ciupitu

60

Ben hayranıyım !$, !^ve !*son öğe, olmayan ilk komut öğesi ve olmayan tüm komut öğeleri: En son gönderilen komut satırından, dönen, expandos. Görmek için (Kabuğun önce komutu yazdırdığını unutmayın):

$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz

ls filea filebBunlardan birini vi !$veya her ikisini birden düzenlemek istediğinizde bu kullanışlı olur vimdiff !*. Ayrıca " nth argümanı" na genelleştirilebilir :

$ echo foo bar baz
$ echo !:2
echo bar
bar

Son olarak, yol adları ile, yukarıdaki genişletmelere ekleyerek :hve yolun bazı bölümlerine :tulaşabilirsiniz:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id

'eko !! 2' yaptım olması gerektiği düşünüyorum bu benim için ve daha sonraki sonrası ben testereden değil iş: 'eko: 2!'
user13060

8
.bashrc ve herhangi birine "bind Space: magic-space" ekleyin! kombinasyonu vurduğunuzda otomatik olarak genişletilir.
Yoo

47

Komutları çalıştırırken, bazen daha önceki argümanlarla bir komut çalıştırmak isteyeceğim. Bunu yapmak için şu kısayolu kullanabilirsiniz:

$ mkdir /tmp/new
$ cd !!:*

Ara sıra, find komutunu kullanmak yerine, dosyalar listesinde bir grup komut çalıştırmam gerekirse tek satırlık bir döngü oluşturacağım.

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

.Bash_login (veya .bashrc) içindeki komut satırı geçmişi seçeneklerini yapılandırmak gerçekten yararlıdır. Aşağıdakiler Macbook Pro'mda kullandığım bir kadrodur.

Aşağıdakileri ayarlamak bash geçmişinizdeki yinelenen komutları siler:

export HISTCONTROL="erasedups:ignoreboth"

Ayrıca tarihimin boyutunu da oldukça yüksek. Neden olmasın? Bugünün mikroişlemcilerinde hiçbir şey yavaşlamıyor gibi görünüyor.

export HISTFILESIZE=500000
export HISTSIZE=100000

Yaptığım başka bir şey de benim geçmişimdeki bazı komutları görmezden gelmek. Çıkış komutunu hatırlamanıza gerek yoktur.

export HISTIGNORE="&:[ ]*:exit"

Kesinlikle histansını ayarlamak istiyorsunuz. Aksi halde bash, çıktığınızda geçmişinizin üzerine yazar.

shopt -s histappend

Kullandığım diğer bir seçenek de cmhist. Bu, çok satırlı komutları geçmişe tek bir komut olarak kaydetmenizi sağlar.

shopt -s cmdhist

Son olarak, Mac OS X'te (vi modunu kullanmıyorsanız), <CTRL> -S'yi kaydırma durdurma olarak sıfırlamak istersiniz. Bu, bash'ın ileri arama olarak yorumlanmasını önler.

stty stop ""

6
"Alt-" buluyorum. son komutun son sözcüğünü tekrarlamak için "!!: *" dan çok daha iyi.
Weidenrinde

Histroy için eklemeler: 1. düzenli olarak geçmişi kaydedin (aynı anda birden fazla merminiz varsa -a ile) export PROMPT_COMMAND = "history -a" 2. Diğer mermilerden geçmişi okumak için takma ad. takma ad - h = 'tarih -n; geçmişi | grep '
Weidenrinde

export HISTIGNORE = "[] *" gerekli değildir, çünkü HISTCONTROL =
görmezden gelmeniz

Tarih için bir başka güzel şey: export HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde

Birkaç tuş vuruşunu "cd !!: *" dışında kaydetmek için "cd! $" Komutunu deneyin. "! $" Son komutunuzun son argümanı olarak yorumlanacaktır.
Tim Stewart

43

Geçerli klasördeki yalnızca alt dizinler nasıl listelenir ?

ls -d */

Bu basit bir numara, ama bunu bulmak için ne kadar zamana ihtiyacım olduğunu bilemezdin!


2
Mükemmel! Tüm bu yıllar boyunca karşılaşabileceğim en iyi alias lsd='ls -F | grep --color /'şey, aynı şeyi listeleyecekti ama daha topal bir şekilde. Ancak, ayrıştırma kolaylığı için satır başına bir dizin listeler. Aynı şeyi yapmak için emrini değiştirdim:ls -d1 */
Artem Russakovskii

bu nasıl çalışıyor? "ls -d" sadece listeler. (ki bu garip) ama "ls -d * /" çalışıyor.
Yoo

1
Biraz zor ... "ls -d", "ls -d ./" ve "ls -d /" ile "ls -d ./*/" ye benzer. '-D' anahtar kümesi 'ls' tu yalnızca dizin girişlerini listeler, ancak parametre vermezseniz, geçerli dizini parametre olarak kullanır, bu nedenle * yalnızca "." listelenecek dizin ...
edomaur

1
Bunu daha önce hiç keşfetmediğime inanamıyorum. Harika bir ipucu.
Nick Dixon

Kelime yok, sadece vay !!! :)
dimba

41

ESC.

Son bash komutunuzdan son argümanları ekler. Düşündüğünüzden daha kullanışlı.

cp file /to/some/long/path

CD ESC.


Bu benim için çalışıyor (bash). Esc tuşuna ve sonra nokta tuşuna bastığınızı unutmayın. Kısa çizgi veya başka bir şey yok.
Howler

9
Ayrıca alt-. Aynı şey mi.
Mark Baker

Evet, sadece Bash. Ancak <esc> (veya Alt- veya Meta-) _ aynı işleve bağlıdır ve <esc> -_ de vi modunda çalışır.
Nick Dixon

@hendry benim zsh gerçekten çalışıyor. Belki vi modunu kullanıyorsunuz?
ZyX

Klavye isabetleri için kbd-etiketini kullanın: <kbd> ESC </kbd> (Ancak kod biçimlendirme / girintiyle birlikte çok hoş oynamaz).
kullanıcı bilinmiyor

36

Elbette, " diff file1.txt file2.txt" yapabilirsiniz , ancak Bash , komutların çıkışına izin veren işlem ikamesini destekler diff.

Örneğin, betiğimin bana beklediğim çıktıyı verdiğinden emin olmak istediğimi varsayalım. Betiğimi <() diffiçine alabilir ve hızlı ve kirli bir birim testi almak için besleyebilirim :

$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh 
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

Başka bir örnek olarak, diyelim ki iki sunucunun kurulu aynı RPM listesine sahip olup olmadığını kontrol etmek istiyorum. Her sunucuya sshing yapmak, her RPM listesini ayrı dosyalara yazmak ve diffbu dosyalar üzerinde bir şey yapmak yerine diff, iş istasyonumdan yapabilirim:

$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$

Http://tldp.org/LDP/abs/html/process-sub.html adresindeki Gelişmiş Bash-Scripting Kılavuzu'nda daha fazla örnek bulunmaktadır .


35

En sevdiğim komut "ls -thor"

En son değiştirilen dosyaları uygun şekilde okunabilir bir formatta listelemek için tanrıların gücünü çağırır .


6
Tamamen yararsız ama aynı zamanda komik komut başka, hatırlatıyor: ls -bart -simpson -ruls. S, ICNR
filiprem

Büyük dosyaları hızlı bir şekilde bulabileceğiniz için 'ls -tor' da yararlıdır. Ayrıca gök gürültüsü tanrısı isminin orijinal İsveççe yazımı aslında 'Tor'dur.
dala

Danca da ls -lort"bok" anlamına gelen Danca kelime olan kullanabilirsiniz . Herhangi bir grubu atlamak ve valhal gazabını almak değil :)
Jesper Rønn-Jensen

1
biri de görünüşte Tolkien ve Yüzüklerin Efendisi ile ilgisi olan "ls -lotr" gibi diyebiliriz :)
ADEpt

28

Bir yenilik daha, ama akıllı ...

Kullanılan en iyi 10 komut:

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

Örnek çıktı:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi

1
İşte daha kısa, daha hızlı bir sürüm:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
sonraki duyuruya kadar duraklatıldı.

25

^ R geri arama. ^ R tuşuna basın, eşlemek istediğiniz önceki komutun bir parçasını yazın ve istediğiniz komutu bulana kadar ^ R tuşuna basın. O zaman hala geçmişimde olan son kullanılan komutları hatırlamak zorunda değilim. Sadece bash değil, aynı zamanda: Satır sonu için ^ E, satır başı için ^ A, sırasıyla imleçten önce ve sonra silmek için ^ U ve ^ K.


2
^ U'yu asla hatırlamıyorum nedense. Bir kelime silme silme kısayolu da yok mu?
hoyhoy

1
^ W imleçten önceki sözcüğü siler. (Cevabınızı bununla düzenlemekten çekinmeyin.)
Jon Ericson

2
^ R o kadar yararlı ki soruda bahsedildi :)
Mark Baker

20

Vi, ls, vb. İçin takma adlarım var, ancak bazen takma addan kaçmak istiyorsunuz. Öndeki komuta ters eğik çizgi eklemeniz yeterlidir:

Örneğin:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

Güzel, değil mi?


Ayrıca çalıştırabilirsiniz commandte- bakınız SHELL BUILTIN COMMANDSBash kılavuzda.
Iceland_jack

17

İşte birkaç yapılandırma ayarı:

~/.inputrc:

"\C-[[A": history-search-backward
"\C-[[B": history-search-forward

Bu aynı şekilde çalışır ^Rancak bunun yerine ok tuşlarını kullanır. Bu , klasörün içine en cd /media/son yaptığım şeye gitmek için yazabiliyorum (ör.) Sonra yukarı ok tuşuna basabileceğim anlamına gelir .cd/media/

(Gnome Terminalini kullanıyorum, diğer terminal emülatörlerinin kaçış kodlarını değiştirmeniz gerekebilir.)

Bash tamamlama da inanılmaz derecede faydalı, ancak çok daha ince bir ek. İçinde ~/.bashrc:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Bu, program başına sekme tamamlamayı etkinleştirir (örn. Komut satırı ile başladığında sekme tamamlama girişiminde evinceyalnızca açığa çıkabilen dosyaları açabilir ve ayrıca komut satırı seçeneklerini sekme ile tamamlar).

Bununla da güzelce çalışır ~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

+1 bash_completion harika
başkanlık

Mac'te, ok tuşlarıyla Geçmiş araması şu şekilde etkinleştirilebilir: bind '"\ e [A"': geçmiş-geriye-arama bağlama '"\ e [B"': geçmiş-ileri arama
Asmus

17

Aşağıdakileri çok kullanıyorum:

:pDeğiştirici bir geçmiş sonucunu yazdırmak için. Örneğin

!!:p

Son komutu yazdırır, böylece tekrar çalıştırmadan önce doğru olup olmadığını kontrol edebilirsiniz. Sadece !!yürütmek için girin .

Benzer damar içinde:

!?foo?:p

Geçmişinizde 'foo' dizesini içeren en son komutu arar ve yazdırır.

Yazdırmanız gerekmiyorsa,

!?foo

aramayı yapar ve hemen yürütür.


2
: P yerine, magic-space kullanabilirsiniz: stackoverflow.com/questions/603696/…
Yoo

'da gizli sihir alanı çalıştırmadan tarihsel kontrolleri genişletmekbind Space:magic-space # !pin<space>
SergioAraujo

16

Gizli bir silahım var: shell-fu.

Binlerce akıllı ipucu, havalı püf noktaları ve çoğu zaman tek bir hatta sığacak etkili tarifler var.

Sevdiğim biri (ama şimdi Python'un çoğu Unix sisteminde yüklü olduğu gerçeğini kullandığım için biraz hile yapıyorum):

alias webshare='python -m SimpleHTTPServer'

Şimdi "webshare" yazdığınızda, geçerli dizin 8000 bağlantı noktası üzerinden kullanılabilir. USB anahtarı veya uzak dir olmadan yerel bir ağda arkadaşlarınızla dosya paylaşmak istediğinizde gerçekten güzel. Video ve müzik akışı da işe yarayacaktır.

Ve elbette tamamen işe yaramaz ama yine de çok eğlenceli olan klasik çatal bombası:

$ :(){ :|:& };:

Bir üretim sunucusunda denemeyin ...


Sanırım ben webshare olmamalı /
Yoo

Sanırım komutu basitleştirebilirsiniz python -m SimpleHTTPServer(orijinal komutun yaptığı fantezi bir şey eksik olmadıkça
Jesper Rønn-Jensen 28:10

Meh. Bir üretim sunucusunda bu çatal bomba sadece OS tarafından boğulur; herhangi bir kullanıcının oluşturabileceği işlem sayısında sınırlamalar vardır.
Donal Fellows

3
@Donal: Denemelisiniz ve bulgularınızı rapor etmelisiniz.
Michael Foukarakis

12

Değişiklikleri aramak için watch komutunu başka bir komutla birlikte kullanabilirsiniz. Bunun bir örneği, yönlendiricimi test ederken ve sinyal-gürültü oranı gibi şeylerde güncel numaralar almak istedim.

watch --interval=10 lynx -dump http://dslrouter/stats.html

Watch komutu gerçekten harika. İlk olarak yaklaşık beş yıl önce Linux Server Hacks kitabında okudum. Var olduğunu kim bilebilirdi?
hoyhoy

11
'Watch' ın bash ile ne ilgisi var?
Artem Russakovskii

11
type -a PROG

PROG'un kullanılabildiği tüm yerleri bulmak için, genellikle / usr / bin / PROG yerine beklenilen ~ / bin yerine bir yerde.


1
Ayrıca bir işlev veya takma ad olup olmadığını da söyleyecektir. Eğer birden fazla yerde bulunuyorsa, PATHher birini gösterecektir.
sonraki duyuruya kadar duraklatıldı.

11

Ben yankı ile komutlar oluşturmak ve onları kabuğa boru gibi:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

Neden? Çünkü yapmadan önce ne yapılacağına bakmamı sağlıyor. Bu şekilde korkunç bir hatayla karşılaşırsam (ana dizinimi kaldırmak gibi), gerçekleşmeden önce yakalayabilirim. Açıkçası, bu en yıkıcı veya geri alınamaz eylemler için önemlidir.


1
İçinde beyaz boşluk bulunan dosya ve klasörlerle ilgili sorunları önlemek için find -print0 ve xargs -0 işlevlerini kullanmak isteyebilirsiniz.
neu242

Veya adlarında boşluk bulunan dosya ve klasörler oluşturmaktan ve bunlarla çalışmaktan kaçının. ;-) Açıkçası kullanıcı tarafından oluşturulan isimlerle çalışıyorsanız, öneriniz hayati önem taşımaktadır.
Jon Ericson

4
Neden "echo" yu kaldırabildiğinizde neden "| ksh -s" ifadesini ekleyesiniz?
Yoo

GNU ile boruya gerek yok:$ find dir -name \\*~ -exec rm {} +
bobbogo

10

Büyük bir dosyayı indirirken oldukça sık yaparım:

while ls -la <filename>; do sleep 5; done

Ve sonra sadece ctrl + c işim bittiğinde (veya lssıfırdan farklı bir değer döndürürse). watchPrograma benzer ancak bunun yerine kabuğu kullanır, bu yüzden içermeyen platformlarda çalışır watch.

Başka bir yararlı araç netcat veya nc. Yaparsan:

nc -l -p 9100 > printjob.prn

Daha sonra başka bir bilgisayara yazıcı kurabilir, bunun yerine netcat çalıştıran bilgisayarın IP adresini kullanabilirsiniz. Yazdırma işi gönderildiğinde, netcat çalıştıran bilgisayar tarafından alınır ve içine atılır printjob.prn.


Neden böyle, örneğin değil wget?
Porges

Deneyin watch ls -la <filename>(varsayılanı 2 saniye beğenmezseniz -n5 kullanın).
Ted Percival

1
@Ted, watchSolaris, Mac OS X gibi tüm platformlarda mevcut değildir. @Porges, ne demek istediğinizden emin değilim. Wget ayrıca bir limanda dinleyebilir mi?
dreamlax


10

Bir ağaç hiyerarşisinde çok farklı yerlerde birden çok dizin kullanırken gezinmenin tercih edilen bir yolu acf_func.sh kullanmaktır (aşağıda listelenmiştir). Bir kez tanımlandıktan sonra,

cd -

sayısal menü ile son dizinlerin bir listesini görmek için

cd -2

en son ikinci dizine gitmek için

Kullanımı çok kolay, çok kullanışlı.

İşte kod:

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi

10

Korkunç girişe çarpmadan önce karmaşık hatları genişletin

  • Alt+ Ctrl+ e- kabuk hattını genişletmek (kullanım gerekebilir Esc, Ctrl+ eklavyenizdeki)
  • Ctrl+ _- geri al
  • Ctrl+ x, *- glob-expand-word

$ echo !$ !-2^ * Alt+ Ctrl+ e
$ echo aword someotherword * Ctrl+ _
$ echo !$ !-2^ * Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h

Ve c.


+1, her zaman basmaktan korkuyorum Enter:)
João Portela

Bunlardan hiçbirini bilmiyordum. Geri al bir katildir. Herhangi bir komut satırı düzenlemesi için iyi.
Philippe A.30

9

Her zaman kısmi oldum:

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

Ayrıca kullanıyorum shopt -s cdable_vars, o zaman ortak dizinlere bash değişkenleri oluşturabilirsiniz. Yani, şirketimin kaynak ağacı için, aşağıdaki gibi bir sürü değişken oluşturuyorum:

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

daha sonra bu dizine değiştirebilirim cd Dcentmain.


Home ve End, crtl-A ve ctrl-E ile aynı şeyleri yapar.
davidfg4

Bu, ev ve bitiş anahtarları olmayan Mac Dizüstü Bilgisayarlarda yardımcı olur.
jamesh

Ne yazık ki ctrl-A screenvarsayılan olarak çıkış anahtarıdır . Ben ctrl-X benim için remap .screenrc, ama sonra bir emacs kullanıcı değilim.
sistem DURAKLAT

Cdable_vars seçeneği ile ilgili olarak, CDPATH ortam değişkeni de vardır. Ama bu farklı çalışır, çünkü PATH'de olduğu gibi üst dizini ayarlarsınız. Cdable_vars ile daha fazla kontrol elde edersiniz.
Zecc

1
Kısayol listeniz için daha fazlası: İmleçten satır sonuna kadar her şeyi silmek için CTRL + K, imleçten önceki her şeyi silmek için CTRL + U, bir kelimeyi ileri / geri taşımak için ALT + F / ALT + B (veya CTRL + sol ok / CTRL) + sağ ok). Cdable_vars için +1!
Philippe A.30

8

pbcopy

Bu, Mac sistem panosuna kopyalanır. Komutları buna bağlayabilirsiniz ... deneyin:

pwd | pbcopy


NB! Bu, Mac'e özgü bir komuttur.
dala

Bunlar değil: alias pbcopy='xsel --clipboard --input' ve alias pbpaste='xsel --clipboard --output'
wawawawa

7
$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done

history 10Bunun yerine kullanın history | tail -10( tail -n 10bu sözdizimi kullanımdan kaldırıldığı için bu arada olmalıdır ).
sonraki duyuruya kadar duraklatıldı.

7

Komut satırından 'set -o vi' veya daha iyisi .bashrc içinde kullanıldığında, komut satırında vi düzenleme moduna geçersiniz. 'Ekle' modunda başlarsınız, böylece normal şekilde yazıp geri alabilirsiniz, ancak 'büyük' ​​bir hata yaparsanız esc tuşuna basabilir ve daha sonra vi'da yaptığınız gibi hareket etmek için 'b' ve 'f' kullanabilirsiniz. bir kelimeyi değiştirmek için cw. Değiştirmek istediğiniz bir geçmiş komutunu getirdikten sonra özellikle kullanışlıdır.


7

Yukarıdakilerin çoğuna benzer şekilde, şimdiki favorim tuş vuruşu [alt]. (Alt ve "." Tuşları birlikte) bu $! İle aynıdır! (Bir önceki komuttan son argümanı ekler), hemen ve benim için yazılması daha kolay. (Sadece komut dosyalarında kullanılamaz)

Örneğin:

mkdir -p /tmp/test/blah/oops/something
cd [alt].

Ayrıca Alt- [0-9] ile birleştirmeyi deneyin (ilk kombinasyonu vurun, ardından bırakın, sonra bırakın). örneğin, son komut 'mv foo bar' ise, "Alt-0 Alt-." 'mv', "Alt-1 Alt-." 'foo' verir, "Alt-2 Alt-." ve temel Alt-. her ikisi de 'bar' vb. verir.
Sam Stokes

1
Ayrıca Alt- tuşuna basmayı deneyin. birden fazla kez (veya Alt tuşunu basılı tutun, orada tutun, nokta tuşuna birçok kez basın ve ardından Alt tuşunu bırakın) Bu, Ctrl-R tuşlarına bir defadan fazla basmaya benzer.
Yoo

7

&& komutunu kullanarak birden fazla komutu bir araya getirme :

./run.sh && tail -f log.txt

veya

kill -9 1111 && ./start.sh

1
biri başarısız olursa, diğer komut yürütülmez (programlamada olduğu gibi hızlı başarısız olur)
Frederic Morin

1
Bunun tersi mantıklı veya '||' kullanmaktır. sağ taraf sadece sol taraf yanlışsa çalıştırılacaktır. Örnek: <code> komut_1 || command_2 </code>
dala
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.