Apa trik baris perintah paling favorit Anda menggunakan Bash? [Tutup]

156

Kita semua tahu cara menggunakan <ctrl>-Runtuk membalikkan pencarian melalui riwayat, tetapi tahukah Anda bahwa Anda dapat menggunakannya <ctrl>-Suntuk meneruskan pencarian jika Anda atur stty stop ""? Juga, pernahkah Anda mencoba menjalankan bind -p untuk melihat semua pintasan keyboard Anda tercantum? Ada lebih dari 455 di Mac OS X secara default.

Apa trik tersembunyi, pintasan keyboard, atau konfigurasi shopt favorit Anda menggunakan bash?

Robert Harvey
sumber
2
Harap ulangi ini untuk mengatakan "Apa favorit Anda yang paling tunggal". Ini memungkinkan orang untuk memilih suara tertentu, hampir seperti sebuah jajak pendapat.
SCdF
> Harap ulangi ini untuk mengatakan "Apa favorit Anda yang paling tunggal". Selesai
Martin Klinke
1
Ada klon StackOverflow untuk pertanyaan ini: commandlinefu.com
rkb
Hanya 232 dari 455 kunci-kunci standar yang melakukan sesuatu selain dari "self-insert" ("ketik kunci ini"): $ bind -p | grep -v self-insert | wc
Ed Brannin
Beberapa barang rapi di sini. Tetapi harus dicatat bahwa beberapa dari mereka hanya bekerja ketika bash dalam mode emacs ...
Mo.

Jawaban:

157

Mengganti nama / memindahkan file dengan sufiks dengan cepat:
cp /home/foo/realllylongname.cpp{,-old}

Ini berkembang menjadi:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old

pengguna10765
sumber
12
Luar biasa! Sekarang saya perlu mencoba dan mengingat yang ini.
Jon Ericson
9
Hanya untuk menunjukkan bahwa untuk melakukan yang sebaliknya (dari .cpp-old ke .cpp) Anda akan melakukan cp /home/foo/realllylongname.cpp{-old,}
Michael Ekoka
Sangat jelas dalam retrospeksi, namun saya pikir saya tidak ingat untuk melakukannya sendiri. Terima kasih!
Zecc
150
cd -

Ini setara dengan command-line dari tombol kembali (membawa Anda ke direktori sebelumnya Anda berada di).

Mark Biek
sumber
6
Saya lebih suka menggunakan pushddan popdmemelihara tumpukan direktori, sendiri.
Alex M
21
Tetapi 'cd -' memiliki keuntungan bekerja bahkan jika Anda tidak ingat untuk menggunakan pushd.
Sergio Acosta
10
Perlu disebutkan bahwa 'cd' membawa Anda ke direktori home Anda.
dr-jan
Sangat menarik bahwa ini tidak muncul di man cdatau, cd --help(setidaknya milikku).
Halil Özgür
135

Favorit lain:

!!

Ulangi perintah terakhir Anda. Paling berguna dalam bentuk:

sudo !!
amrox
sumber
81
itu memiliki manfaat tambahan membuat Anda terdengar sangat marah tentang hal itu juga. "Komputer, lakukan ini." "Akses ditolak". "LAKUKAN!!"
nickf
Itu tidak banyak diketahui! :-)
hoyhoy
10
Hal serupa yang dapat Anda lakukan: mkdir testdir; cd !$.. Ini berjalan cd [last word of previous line](dalam contoh, cd testdir)
dbr
13
Make Me A Sandwich Sudo !!
Kibbee
Jika Anda suka !!,! $ Dan! -1: ^ foo ^ bar, Anda juga akan "mengikat Space: magic-space". stackoverflow.com/questions/603696/…
Yoo
81

Favorit saya adalah '^ string ^ string2' yang mengambil perintah terakhir, menggantikan string dengan string2 dan menjalankannya

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

Panduan sejarah baris perintah Bash

seth
sumber
Ini tidak serakah. Bagaimana saya membuatnya serakah?
Altreus
9
!!:gs/ehco/echo/
andre-r
Halaman ke-2 dari panduan itu sangat penting
jmoz
1
@ andre-r: !!:gs/ehco/echo/melakukan pencarian global dan ganti pada perintah terakhir (berunding !!di stackoverflow.com/questions/68372/… ). Itu tidak setara dengan ^ehco^echoyang hanya menggantikan satu contoh "ehco" - respons yang lebih akurat adalah !!:s/ehco/scho.
Iceland_jack
64

ganti nama

Contoh:

$ 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

Sangat bermanfaat

Jiaaro
sumber
3
Wow, saya telah menjadi orang bodoh selama bertahun-tahun ini menggunakan trik basename, mv dan {} untuk melakukan ini. / dahi kepala
Gregg Lind
7
mengubah nama tidak khusus bash / readline seperti posting lainnya.
senjata
1
zmv dari distribusi zsh jauh lebih baik dalam banyak kasus.
ZyX
util-linux-ng memiliki perintah rename juga dan tidak seperti yang disebutkan dalam jawaban ini. Perintah yang dijelaskan di sini sebenarnya mmv .
Cristian Ciupitu
60

Saya penggemar !$, !^dan !*expo, kembali, dari baris perintah yang terakhir dikirim: item terakhir, item non-perintah pertama, dan semua item non-perintah. To wit (Perhatikan bahwa shell mencetak perintah terlebih dahulu):

$ 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

Hal ini sangat berguna ketika Anda, katakanlah ls filea fileb, dan ingin mengedit salah satu dari mereka: vi !$atau keduanya: vimdiff !*. Itu juga dapat digeneralisasi ke " nargumen th" seperti:

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

Akhirnya, dengan nama path, Anda bisa mendapatkan bagian dari path dengan menambahkan :hdan :tke salah satu dari expo di atas:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
Pi.
sumber
'gema !! 2' tidak bekerja untuk saya dan dari posting kemudian saya melihat bahwa saya pikir itu seharusnya: 'gema!: 2'
user13060
8
tambahkan "bind Space: magic-space" ke .bashrc dan lainnya! kombinasi akan diperluas secara otomatis ketika Anda menekan spasi.
Yoo
47

Saat menjalankan perintah, terkadang saya ingin menjalankan perintah dengan argumen sebelumnya. Untuk melakukan itu, Anda dapat menggunakan pintasan ini:

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

Kadang-kadang, sebagai pengganti menggunakan find, saya akan memecah loop satu-baris jika saya perlu menjalankan banyak perintah pada daftar file.

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

Mengkonfigurasi opsi histori baris perintah di .bash_login (atau .bashrc) saya sangat berguna. Berikut ini adalah kader pengaturan yang saya gunakan di Macbook Pro saya.

Mengatur yang berikut ini membuat bash menghapus perintah duplikat dalam riwayat Anda:

export HISTCONTROL="erasedups:ignoreboth"

Saya juga mendongkrak ukuran sejarah saya juga cukup tinggi. Kenapa tidak? Tampaknya tidak memperlambat apa pun pada mikroprosesor saat ini.

export HISTFILESIZE=500000
export HISTSIZE=100000

Hal lain yang saya lakukan adalah mengabaikan beberapa perintah dari histori saya. Tidak perlu mengingat perintah keluar.

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

Anda pasti ingin mengatur histappend. Jika tidak, bash akan menimpa riwayat Anda saat Anda keluar.

shopt -s histappend

Pilihan lain yang saya gunakan adalah cmdhist. Ini memungkinkan Anda menyimpan perintah multi-baris ke riwayat sebagai satu perintah.

shopt -s cmdhist

Terakhir, pada Mac OS X (jika Anda tidak menggunakan mode vi), Anda ingin mengatur ulang <CTRL> -S agar tidak berhenti scroll. Ini mencegah bash untuk dapat menafsirkannya sebagai pencarian maju.

stty stop ""
hoyhoy
sumber
6
Saya menemukan "Alt-." jauh lebih baik daripada "!!: *" untuk mengulangi kata terakhir dari perintah terakhir.
Weidenrinde
Tambahan untuk histroy: 1. secara teratur menyimpan histori (dengan -a jika Anda memiliki banyak shell yang terbuka sekaligus) ekspor PROMPT_COMMAND = "history -a" 2. Alias ​​untuk membaca histori dari shell lain. alias - h = 'history -n; sejarah | grep '
Weidenrinde
export HISTIGNORE = "[] *" tidak diperlukan, karena HISTCONTROL = ignoreboth Anda harus melakukan hal yang sama
Weidenrinde
Hal baik lainnya untuk sejarah: ekspor HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde
Untuk menyimpan beberapa penekanan tombol dari "cd !!: *", coba "cd! $". "! $" Akan ditafsirkan sebagai argumen terakhir dari perintah terakhir Anda.
Tim Stewart
43

Bagaimana cara mendaftar hanya subdirektori dalam direktori saat ini?

ls -d */

Ini trik sederhana, tetapi Anda tidak akan tahu berapa banyak waktu yang saya butuhkan untuk menemukan itu!

edomaur
sumber
2
Luar biasa! Selama bertahun-tahun yang terbaik yang bisa saya lakukan adalah alias lsd='ls -F | grep --color /', yang akan mendaftar hal yang sama tetapi dengan cara yang lebih timpang. Namun, itu akan mencantumkan satu dir per baris, untuk kemudahan parsing. Saya telah memodifikasi perintah Anda untuk melakukan hal yang sama:ls -d1 */
Artem Russakovskii
bagaimana cara kerjanya? "ls -d" daftar saja. (Yang aneh) tetapi "ls -d * /" bekerja.
Yoo
1
Agak sulit ... "ls -d" mirip dengan "ls -d ./" dan "ls -d /" to "ls -d ./*/". Saklar '-d' menetapkan 'ls' hanya daftar entri direktori, tetapi jika Anda tidak memberikan parameter, ia menggunakan direktori saat ini sebagai parameter, sehingga hanya memiliki * "." direktori ke daftar ...
edomaur
1
Aku tidak percaya aku belum pernah menemukan ini sebelumnya. Tip yang bagus.
Nick Dixon
Tidak ada kata, hanya wow !!! :)
dimba
41

ESC.

Menyisipkan argumen terakhir dari perintah bash terakhir Anda. Ini berguna lebih dari yang Anda pikirkan.

cp file /to/some/long/path

CD ESC.

amrox
sumber
Ini bekerja untuk saya (bash). Perhatikan bahwa Anda menekan tombol esc dan kemudian tombol periode. Tidak ada tanda hubung atau apa pun.
Howler
9
Juga alt-. adalah hal yang sama.
Mark Baker
Ya, hanya Bash. Tetapi <esc> (atau Alt- atau Meta-) _ terikat ke fungsi yang sama, dan <esc> -_ juga berfungsi dalam mode-vi juga.
Nick Dixon
@endry di zsh saya itu benar-benar berfungsi. Mungkin Anda menggunakan mode vi?
ZyX
Gunakan tag kbd untuk hits keyboard: <kbd> ESC </kbd> (Tapi tidak bermain sangat baik bersama dengan pemformatan kode / indentasi).
pengguna tidak diketahui
36

Tentu, Anda bisa " diff file1.txt file2.txt", tetapi Bash mendukung substitusi proses , yang memungkinkan Anda untuk diffoutput dari perintah.

Misalnya, katakanlah saya ingin memastikan skrip saya memberi saya hasil yang saya harapkan. Saya cukup membungkus skrip saya di <() dan mengumpankannya diffuntuk mendapatkan tes unit cepat dan kotor:

$ 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
$

Sebagai contoh lain, katakanlah saya ingin memeriksa apakah dua server memiliki daftar RPM yang sama diinstal. Daripada melakukan sshing ke setiap server, menulis setiap daftar RPM untuk memisahkan file, dan melakukan diffpada file-file itu, saya hanya dapat melakukan diffdari workstation saya:

$ 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
$

Ada lebih banyak contoh dalam Panduan Script Bash Lanjutan di http://tldp.org/LDP/abs/html/process-sub.html .

Philip Durbin
sumber
35

Perintah favorit saya adalah "ls -thor"

Itu memanggil kekuatan para dewa untuk membuat daftar file yang paling baru dimodifikasi dalam format yang mudah dibaca.

pengguna10109
sumber
6
Mengingatkan saya yang lain, sama sekali tidak berguna tetapi juga perintah lucu: ls -bart -simpson -ruls. S, ICNR
filiprem
'ls -tor' juga berguna karena Anda dapat dengan cepat menemukan file besar. Dan juga, ejaan Swedia asli nama dewa guntur sebenarnya 'Tor'.
dala
Di Denmark Anda dapat menggunakan ls -lortkata Denmark untuk "sial". Menghilangkan kelompok mana pun dan tidak mendapatkan murka valhal :)
Jesper Rønn-Jensen
1
kita juga bisa mengatakannya seperti "ls -lotr" yang tampaknya ada hubungannya dengan Tolkien dan Lord Of The Rings :)
ADEpt
28

Lebih seperti hal baru, tapi pintar ...

10 perintah teratas yang digunakan:

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

Output sampel:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi
ctcherry
sumber
1
Berikut ini versi yang lebih singkat, lebih cepat:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
Dijeda hingga pemberitahuan lebih lanjut.
25

^ R balikkan pencarian. Tekan ^ R, ketikkan fragmen dari perintah sebelumnya yang ingin Anda cocokkan, dan tekan ^ R hingga Anda menemukan yang Anda inginkan. Maka saya tidak harus mengingat perintah yang baru saja digunakan yang masih dalam sejarah saya. Tidak hanya bash, tetapi juga: ^ E untuk akhir baris, ^ A untuk awal baris, ^ U dan ^ K untuk menghapus sebelum dan sesudah kursor.

pengguna10741
sumber
2
Aku tidak pernah bisa mengingatnya karena suatu alasan. Apakah tidak ada kata delete juga jalan pintas?
hoyhoy
1
^ W menghapus kata sebelum kursor. (Jangan ragu untuk mengedit jawaban Anda dengan ini.)
Jon Ericson
2
^ R sangat berguna sehingga disebutkan dalam pertanyaan :)
Mark Baker
20

Saya sering memiliki alias untuk vi, ls, dll. Tetapi kadang-kadang Anda ingin menghindari alias. Tambahkan saja garis miring ke perintah di depan:

Misalnya:

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

Keren bukan?

Srikanth
sumber
Anda juga dapat menjalankan command—lihat SHELL BUILTIN COMMANDSdi manual Bash.
Iceland_jack
17

Berikut beberapa konfigurasi tweak:

~/.inputrc:

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

Ini berfungsi sama ^Rtetapi menggunakan tombol panah saja. Ini berarti saya dapat mengetik (mis.) cd /media/Lalu tekan panah atas untuk menuju ke hal terakhir yang saya cdingin masuk ke dalam/media/ folder.

(Saya menggunakan Terminal Gnome, Anda mungkin perlu mengubah kode pelarian untuk emulator terminal lainnya.)

Penyelesaian Bash juga sangat berguna, tetapi ini merupakan tambahan yang jauh lebih halus. Di ~/.bashrc:

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

Ini akan memungkinkan penyelesaian tab per program (misalnya, mencoba penyelesaian tab saat baris perintah dimulai evince hanya akan menampilkan file yang dapat dibuka oleh setiap program, dan juga opsi tab-selesai opsi baris perintah).

Bekerja dengan baik dengan ini juga di ~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
Porges
sumber
+1 bash_completion is awesome
prestomation
Di Mac, pencarian Riwayat dengan tombol panah dapat diaktifkan dengan: bind '"\ e [A"': bind pencarian-mundur-sejarah '"\ e [B"': pencarian-riwayat-maju
Asmus
17

Saya menggunakan banyak hal berikut:

The :ppengubah untuk mencetak hasil sejarah. Misalnya

!!:p

Akan mencetak perintah terakhir sehingga Anda dapat memeriksa apakah itu benar sebelum menjalankannya lagi. Cukup masukkan!! untuk menjalankannya.

Dalam nada yang sama:

!?foo?:p

Akan mencari riwayat Anda untuk perintah terbaru yang berisi string 'foo' dan mencetaknya.

Jika Anda tidak perlu mencetak,

!?foo

melakukan pencarian dan langsung mengeksekusi.

Steve Lacey
sumber
2
Alih-alih menggunakan: p, Anda juga dapat menggunakan magic-space: stackoverflow.com/questions/603696/…
Yoo
untuk memperluas kontrol historis tanpa menjalankan confiure magick-space di bashrcbind Space:magic-space # !pin<space>
SergioAraujo
16

Saya punya senjata rahasia: shell-fu.

Ada ribuan tip cerdas, trik keren, dan resep efisien yang sebagian besar cocok dalam satu baris.

Salah satu yang saya suka (tapi saya sedikit curang karena saya menggunakan fakta bahwa Python diinstal pada sebagian besar sistem Unix sekarang):

alias webshare='python -m SimpleHTTPServer'

Sekarang setiap kali Anda mengetik "webshare", direktori saat ini akan tersedia melalui port 8000. Sangat menyenangkan ketika Anda ingin berbagi file dengan teman-teman di jaringan lokal tanpa kunci usb atau dir remote. Streaming video dan musik juga berfungsi.

Dan tentu saja bom garpu klasik yang sama sekali tidak berguna tetapi masih sangat menyenangkan:

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

Jangan coba itu di server produksi ...

e-satis
sumber
Saya kira saya tidak seharusnya webshare /
Yoo
Saya kira Anda dapat menyederhanakan perintah untuk python -m SimpleHTTPServer(kecuali jika saya melewatkan sesuatu seperti perintah aslinya
Jesper Rønn-Jensen
Ah. Pada server produksi yang bom fork hanya akan dimatikan oleh OS; ada batasan jumlah proses yang dapat dibuat pengguna mana pun.
Donal Fellows
3
@Donal: Anda harus mencobanya dan melaporkan temuan Anda.
Michael Foukarakis
12

Anda dapat menggunakan perintah arloji bersama dengan perintah lain untuk mencari perubahan. Contoh dari ini adalah ketika saya menguji router saya, dan saya ingin mendapatkan nomor terbaru tentang hal-hal seperti rasio signal-to-noise, dll.

watch --interval=10 lynx -dump http://dslrouter/stats.html
HFLW
sumber
Perintah arloji sangat keren. Saya pertama kali membaca tentang di buku Linux Server Hacks sekitar lima tahun yang lalu. Siapa yang tahu itu ada?
hoyhoy
11
Apa hubungannya 'menonton' dengan bash?
Artem Russakovskii
11
type -a PROG

untuk menemukan semua tempat di mana PROG tersedia, biasanya di suatu tempat di ~ / bin daripada yang ada di / usr / bin / PROG yang mungkin diharapkan.

dajobe
sumber
1
Ini juga akan memberi tahu Anda apakah itu fungsi atau alias. Jika berada di beberapa tempat di Anda PATHitu akan menampilkan masing-masing.
Dijeda sampai pemberitahuan lebih lanjut.
11

Saya suka membuat perintah dengan echo dan mengirimkannya ke shell:

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

Mengapa? Karena itu memungkinkan saya untuk melihat apa yang akan dilakukan sebelum saya melakukannya. Dengan begitu jika saya memiliki kesalahan yang mengerikan (seperti menghapus direktori home saya), saya dapat menangkapnya sebelum itu terjadi. Jelas, ini paling penting untuk tindakan yang merusak atau tidak dapat dibatalkan.

Jon Ericson
sumber
1
Anda mungkin ingin menggunakan find -print0 dan xargs -0 untuk menghindari masalah dengan file dan folder dengan spasi putih di dalamnya.
neu242
Atau hindari membuat dan bekerja dengan file dan folder dengan spasi putih di namanya. ;-) Jelas jika Anda bekerja dengan nama yang dibuat pengguna, saran Anda sangat penting.
Jon Ericson
4
Mengapa Anda menambahkan "| ksh -s" ketika Anda bisa menghapus "echo"?
Yoo
Tidak perlu $ find dir -name \\*~ -exec rm {} +
terhubung
10

Saat mengunduh file besar, saya cukup sering melakukannya:

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

Dan kemudian hanya ctrl + c ketika saya selesai (atau jika lsmengembalikan non-nol). Ini mirip dengan watchprogram tetapi menggunakan shell sebagai gantinya, jadi ia bekerja pada platform tanpawatch .

Alat lain yang bermanfaat adalah netcat, atau nc. Jika kamu melakukan:

nc -l -p 9100 > printjob.prn

Kemudian Anda dapat mengatur printer di komputer lain tetapi alih-alih gunakan alamat IP komputer yang menjalankan netcat. Ketika pekerjaan cetak dikirim, itu diterima oleh komputer yang menjalankan netcat dan dibuang ke printjob.prn.

dreamlax
sumber
Kenapa ini dan tidak, misalnya wget,?
porges
Coba watch ls -la <filename>(gunakan -n5 jika Anda tidak suka default 2 detik).
Ted Percival
1
@Ted, watchtidak tersedia di semua platform, seperti Solaris, Mac OS X, dll. @Porges, tidak yakin apa yang Anda maksud. Bisakah wget juga mendengarkan di port?
dreamlax
10

pushddan popdhampir selalu berguna

jdt141
sumber
10

Salah satu cara navigasi yang disukai ketika saya menggunakan banyak direktori di tempat-tempat yang sangat terpisah dalam hierarki pohon adalah dengan menggunakan acf_func.sh (tercantum di bawah). Setelah ditentukan, Anda bisa melakukannya

cd -

untuk melihat daftar direktori terbaru, dengan menu numerik

cd -2

untuk pergi ke direktori terbaru kedua.

Sangat mudah digunakan, sangat praktis.

Berikut kodenya:

# 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
Leonard
sumber
10

Perluas garis rumit sebelum mengenai enter yang ditakuti

  • Alt+ Ctrl+ e- shell-expand-line (mungkin perlu menggunakan Esc, Ctrl+ edi keyboard Anda)
  • Ctrl+ _- batalkan
  • 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

& c.

bobbogo
sumber
+1, saya selalu takut menekan Enter:)
João Portela
Tidak tahu semua ini. Undo adalah pembunuh. Bagus untuk pengeditan baris perintah.
Philippe A.
9

Saya selalu tidak setuju dengan:

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

Saya juga menggunakan shopt -s cdable_vars, maka Anda dapat membuat variabel bash ke direktori umum. Jadi, untuk pohon sumber perusahaan saya, saya membuat banyak variabel seperti:

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

maka saya dapat mengubah ke direktori itu dengan cd Dcentmain.

Drew Frezell
sumber
Home dan End melakukan hal yang sama seperti crtl-A dan ctrl-E.
davidfg4
Ini membantu pada Laptop Mac yang tidak memiliki tombol home dan end.
jamesh
Sayangnya ctrl-A juga merupakan tombol pelolosan screensecara default. Saya remap ke ctrl-X di saya .screenrc, tapi kemudian saya bukan pengguna emacs.
system PAUSE
Agak terkait dengan opsi cdable_vars, ada juga variabel lingkungan CDPATH. Tapi itu bekerja secara berbeda, karena Anda mengatur direktori induk, seperti di PATH. Dengan cdable_vars Anda mendapatkan lebih banyak kontrol.
Zecc
1
Lebih banyak untuk daftar cara pintas Anda: CTRL + K untuk menghapus semuanya dari kursor ke akhir baris, CTRL + U untuk menghapus semuanya sebelum kursor, ALT + F / ALT + B untuk memindahkan satu kata maju / mundur (atau CTRL + panah kiri / CTRL + panah kanan). +1 untuk cdable_vars!
Philippe A.
8

pbcopy

Ini salinan ke clipboard sistem Mac. Anda dapat mengirim perintah ke sana ... coba:

pwd | pbcopy

Max Masnick
sumber
NB! Ini adalah perintah khusus Mac.
dala
Ini bukan: alias pbcopy='xsel --clipboard --input' dan 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
Allan Wind
sumber
Gunakan history 10alih-alih history | tail -10(yang seharusnya tail -n 10karena sintaksnya sudah tidak digunakan lagi).
Dijeda sampai pemberitahuan lebih lanjut.
7

Menggunakan 'set -o vi' dari baris perintah, atau lebih baik, di .bashrc, menempatkan Anda dalam mode edit vi pada baris perintah. Anda mulai dalam mode 'masukkan' sehingga Anda dapat mengetik dan mundur seperti biasa, tetapi jika Anda membuat kesalahan 'besar' Anda bisa menekan tombol esc dan kemudian menggunakan 'b' dan 'f' untuk bergerak seperti yang Anda lakukan di vi. cw untuk mengubah kata. Sangat berguna setelah Anda memunculkan perintah sejarah yang ingin Anda ubah.

Leonard
sumber
7

Mirip dengan banyak di atas, favorit saya saat ini adalah keystroke [alt]. (Alt dan "." Kunci bersamaan) ini sama dengan $! (Menyisipkan argumen terakhir dari perintah sebelumnya) kecuali bahwa itu langsung dan bagi saya lebih mudah untuk mengetik. (Hanya tidak dapat digunakan dalam skrip)

misalnya:

mkdir -p /tmp/test/blah/oops/something
cd [alt].
pengguna11535
sumber
Coba juga kombinasikan dengan Alt- [0-9] (tekan kombinasi pertama, lalu lepaskan, lalu yang kedua). mis. jika perintah terakhir adalah 'mv foo bar', maka "Alt-0 Alt-." memberikan 'mv', "Alt-1 Alt-." memberikan 'foo', "Alt-2 Alt-." dan Alt- dasar. keduanya memberi 'bar', dll.
Sam Stokes
1
Coba juga menekan Alt-. lebih dari sekali (atau tekan Alt, tahan di sana, tekan dot berkali-kali, lalu lepaskan Alt) Ini mirip dengan menekan Ctrl-R lebih dari sekali.
Yoo
7

Rangkai beberapa perintah bersamaan menggunakan perintah && :

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

atau

kill -9 1111 && ./start.sh
TChen
sumber
1
jika salah satu gagal, perintah lainnya tidak akan dieksekusi (gagal cepat, seperti dalam pemrograman)
Frederic Morin
1
Yang sebaliknya adalah menggunakan logika atau '||' di mana sisi kanan hanya akan dieksekusi jika sisi kiri salah. Contoh: <code> command_1 || command_2 </code>
dala