Apa fitur atau trik baris perintah favorit Anda?

94

Bagikan fitur dan trik baris perintah Anda untuk Unix / Linux. Cobalah untuk menyimpannya shell / distro agnostik jika memungkinkan. Tertarik melihat alias, one-liner, pintasan keyboard, skrip shell kecil, dll.

Casey
sumber

Jawaban:

89

Ini agak memperluas !!trik yang disebutkan dalam jawaban ini . Sebenarnya ada banyak perintah terkait sejarah yang cenderung dilupakan (orang cenderung menusuk Up100 kali alih-alih mencari perintah yang mereka tahu mereka ketikkan).

  • The historyperintah akan menampilkan daftar baru menjalankan perintah dengan acara penanda ke kiri
  • !N akan mengganti perintah yang terkait dengan penunjuk acara N
  • !-Nakan menggantikan perintah terbaru N th ; mis. !-1akan menggantikan perintah terbaru, !-2yang kedua terbaru, dll.
  • Seperti disebutkan dalam jawaban lain, !!adalah singkatan untuk !-1, dengan cepat mengganti perintah terakhir
  • !string akan mengganti perintah terbaru yang dimulai dengan string
  • !?string? akan menggantikan perintah terbaru yang berisi string

Penunjuk kata dapat ditambahkan ke !perintah sejarah untuk mengubah hasilnya. Tanda titik dua memisahkan penunjuk acara dan kata, mis !!:0. Penunjuk acara !!dapat disingkat menjadi hanya !ketika menggunakan penunjuk kata, sehingga !!:0setara dengan !:0.

  • !:0 akan mendapatkan perintah yang dieksekusi
  • !:1akan mendapatkan argumen pertama (dan !:2yang kedua, dll.)
  • !:2-3 akan mendapatkan argumen kedua dan ketiga
  • !:^adalah cara lain untuk mendapatkan argumen pertama. !:$akan mendapatkan yang terakhir
  • !:*akan mendapatkan semua argumen (tetapi bukan perintah)

Pengubah juga dapat ditambahkan ke !perintah sejarah, masing-masing diawali oleh tanda titik dua. Nomor berapa pun dapat ditumpuk (misalnya !:t:r:p).

  • h - Berbaris ke nama file dasar
  • t - Hanya nama file dasarnya
  • r - Berbaris ke ekstensi nama file
  • e - Hanya ekstensi nama file
  • s/search/replacement- Ganti kemunculan pertama searchdenganreplacement
  • gs/search/replacement- Ganti semua kemunculan searchdenganreplacement
Michael Mrozek
sumber
3
Dan jika Anda menggunakan Bash (bisa sama untuk beberapa shell lain), M- ^ (Meta- ^) memperluas operator ekspansi sejarah di atas untuk Anda, kalau-kalau Anda ingin melihat apa yang sebenarnya Anda maksudkan untuk.
Eric Smith
1
Saya tidak pernah menemukan penggunaan untuk! perintah hal-hal. Sepertinya buruk bagi saya untuk menjalankan perintah yang tidak saya lihat. Akan sangat mudah untuk mengetik! -3 bukannya! -4, dan siapa yang tahu apa yang bisa terjadi. Menemukan nomor baris dari perintah yang ingin saya jalankan biasanya lebih menyakitkan daripada nilainya. Trik-trik keren, tetapi saya belum pernah menemukan penggunaan yang nyata untuk mereka.
Falmarri
1
@ Falmarri saya tidak pernah menggunakan !-#yang baik. Saya memang menggunakan !stringuntuk menjalankan perintah terakhir yang dimulai dengan string, tetapi saya biasanya tab-lengkapi dulu (zsh) untuk memastikan saya menjalankan hal yang benar
Michael Mrozek
1
Tidak! :) "Menjalankan !Nakan menjalankan perintah ..." adalah deskripsi yang terlalu sempit; sebenarnya, !Nakan diganti oleh perintah ...; dan seterusnya untuk semua deskripsi dalam jawaban. Lebih tepat dan membuka kemungkinan lebih bermanfaat! Misalnya, yang disebutkan sudo !!.
imz - Ivan Zakharyaschev
1
Untuk menjalankan perintah sebelumnya yang dilihat oleh sebuah string, saya biasanya cukup menekan Ctrl-R. Beberapa Ctrl-R akan menggali lebih dalam ke dalam sejarah. Dengan cara ini, saya melihat perintah yang ditemukan segera, dan dapat membuangnya dan melihat lebih jauh. Ctrl-G melarikan diri dari mode ini. Satu-satunya ketidaknyamanan adalah bahwa Ctrl-R adalah untuk bash; di Emacs, untuk menelusuri sejarah perintah dan nilai input (untuk Mx atau nilai baca lainnya) seseorang menggunakan Meta-R sebagai gantinya (Meta-R juga digunakan di eshelldalam Emacs). Jadi saya sering mengacaukannya.
imz - Ivan Zakharyaschev
65

bash - masukkan parameter akhir baris sebelumnya

alt- . kombinasi tombol paling berguna yang pernah ada, coba dan lihat, untuk beberapa alasan tidak ada yang tahu tentang yang ini.

tekan lagi dan lagi untuk memilih parameter terakhir yang lebih lama.

hebat ketika Anda ingin melakukan sesuatu yang lebih pada argumen / file yang Anda gunakan beberapa saat yang lalu.

chillitom
sumber
11
Anda juga dapat menggunakan! $ Untuk merujuk ke argumen terakhir pada perintah sebelumnya. Ini berguna karena berfungsi dalam skrip serta interaktif. (Bekerja di bash & zsh)
4
Setiap kali Anda menekan alt- .itu akan pergi ke perintah sebelumnya dan menarik argumen terakhir dari itu. Jadi jika Anda ingin argumen terakhir dari tiga perintah yang lalu, tekan saja alt- .tiga kali.
clee
2
Ini adalah kunci default yang mengikat untuk yank-last-argperintah readline, jadi itu harus bekerja dengan program apa pun yang terhubung dengan readline, bukan hanya BASH atau ZSH.
James Sneeringer
Dalam mode vi, saya harus memutar ulang yank-last-arg sesuai jawaban ini: superuser.com/questions/18498/…
Jeromy Anglim
Dalam xterm, meta-. menghasilkan ®, tetapi Anda dapat menggunakan esc bukan meta (secara umum dalam bash), jadi esc-. sebagai gantinya.
derobert
49

Favorit saya adalah

man 7 ascii

Sederhana dan sangat bermanfaat.

   Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
   ────────────────────────────────────────────────────────────────────────
   000   0     00    NUL '\0' (null character)   100   64    40    @
   001   1     01    SOH (start of heading)      101   65    41    A
   002   2     02    STX (start of text)         102   66    42    B
   003   3     03    ETX (end of text)           103   67    43    C
   004   4     04    EOT (end of transmission)   104   68    44    D
   005   5     05    ENQ (enquiry)               105   69    45    E
   006   6     06    ACK (acknowledge)           106   70    46    F
   007   7     07    BEL '\a' (bell)             107   71    47    G
   010   8     08    BS  '\b' (backspace)        110   72    48    H
   011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
   012   10    0A    LF  '\n' (new line)         112   74    4A    J
   013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
   014   12    0C    FF  '\f' (form feed)        114   76    4C    L
   015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
   016   14    0E    SO  (shift out)             116   78    4E    N
   017   15    0F    SI  (shift in)              117   79    4F    O
   020   16    10    DLE (data link escape)      120   80    50    P
   021   17    11    DC1 (device control 1)      121   81    51    Q
   022   18    12    DC2 (device control 2)      122   82    52    R
   023   19    13    DC3 (device control 3)      123   83    53    S
   024   20    14    DC4 (device control 4)      124   84    54    T
   025   21    15    NAK (negative ack.)         125   85    55    U
   026   22    16    SYN (synchronous idle)      126   86    56    V
   027   23    17    ETB (end of trans. blk)     127   87    57    W
   030   24    18    CAN (cancel)                130   88    58    X
   031   25    19    EM  (end of medium)         131   89    59    Y
   032   26    1A    SUB (substitute)            132   90    5A    Z
   033   27    1B    ESC (escape)                133   91    5B    [
   034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
   035   29    1D    GS  (group separator)       135   93    5D    ]
   036   30    1E    RS  (record separator)      136   94    5E    ^
   037   31    1F    US  (unit separator)        137   95    5F    _
   040   32    20    SPACE                       140   96    60    `
   041   33    21    !                           141   97    61    a
   042   34    22    "                           142   98    62    b
   043   35    23    #                           143   99    63    c
   044   36    24    $                           144   100   64    d
   045   37    25    %                           145   101   65    e
   046   38    26    &                           146   102   66    f
   047   39    27    '                           147   103   67    g
   050   40    28    (                           150   104   68    h
   051   41    29    )                           151   105   69    i
   052   42    2A    *                           152   106   6A    j
   053   43    2B    +                           153   107   6B    k
   054   44    2C    ,                           154   108   6C    l
   055   45    2D    -                           155   109   6D    m

   056   46    2E    .                           156   110   6E    n
   057   47    2F    /                           157   111   6F    o
   060   48    30    0                           160   112   70    p
   061   49    31    1                           161   113   71    q
   062   50    32    2                           162   114   72    r
   063   51    33    3                           163   115   73    s
   064   52    34    4                           164   116   74    t
   065   53    35    5                           165   117   75    u
   066   54    36    6                           166   118   76    v
   067   55    37    7                           167   119   77    w
   070   56    38    8                           170   120   78    x
   071   57    39    9                           171   121   79    y
   072   58    3A    :                           172   122   7A    z
   073   59    3B    ;                           173   123   7B    {
   074   60    3C    <                           174   124   7C    |
   075   61    3D    =                           175   125   7D    }
   076   62    3E    >                           176   126   7E    ~
   077   63    3F    ?                           177   127   7F    DEL

Lihatlah situs web ini commandlinefu.com .

Anda juga dapat melihat empat artikel ini oleh Peteris Krumins di blog-nya

terdon
sumber
2
Terpisah ascii Program ini juga berguna. Selain mencetak tabel, ini memungkinkan Anda meminta satu atau lebih karakter individual.
Matthew Flaschen
46

Jalankan perintah terakhir sebagai root:

sudo !!
Alex B
sumber
42

Tidak yakin apakah ini dianggap sebagai "trik", tetapi orang-orang tampaknya tidak menyadari hotkey readline standar. Penggunaan khusus dalam kerang:

  • Ctrl+ U- Potong garis saat ini
  • Ctrl+ Y- Tempelkan potongan garis dengan Ctrl+U
  • Ctrl+ L- Bersihkan layar dan gambar ulang garis saat ini
  • Ctrl+ G- Dapatkan baris baru dan abaikan yang sekarang
Michael Mrozek
sumber
5
Untuk menambahkan beberapa di antaranya: Ctrl + A untuk pergi ke awal baris, Ctrl + E untuk pergi ke akhir baris, Ctrl-K untuk menghapus dari kursor ke akhir baris.
rsuarez
Ctrl+Lsesuai dengan karakter ascii FormFeed. Biasanya akan menggambar ulang layar dalam aplikasi teks dengan jendela layar (mis. Vim, less, mc, dll). Bagus jika layar telah "tercemar" oleh beberapa output dari program lain.
hlovdal
Menambahkan ke daftar tombol pintas: Ctrl+Wuntuk memotong satu kata ke belakang, Alt+Funtuk maju satu kata, Alt+Buntuk pergi satu kata ke belakang dalam satu baris. Saya suka Ctrl+Ydan Shift+Insertkarena Anda dapat memiliki dua baris yang disalin. Satu dengan Ctrl+U(tempel dengan Ctrl+Y) dan pada saat yang sama Anda dapat menyalin kata lain (pilih baris) tempel dengan ( Shift+Insert).
36

CTRL+ Rdi BASH untuk mencari / mengaktifkan perintah yang sebelumnya dieksekusi (isi ~ / .bash_history).

Ini seringkali sangat membantu. Menjalankan alias ini akan melayani PWD di atas HTTP (diindeks) pada port 8000:

alias webserver="python -m SimpleHTTPServer"

Dan karena saya menjalankan make sepanjang waktu, dan mengetik dan mengetik terlalu cepat, alias ini mungkin yang paling sering saya gunakan (serius):

alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make

Dan mungkin BASH saya yang paling sering digunakan adalah script sederhana yang saya sebut unggah. Saya menggunakannya untuk mencampur segala jenis konten ke Linode saya, dan menyalin URL HTTP yang dihasilkan ke clipboard saya (klik tengah). Sangat berguna untuk menempelkan hal-hal kepada orang-orang di IRC:

scp -r $* $user@$host:public_html && {
    URL="http://$host/~$user/$(basename $1)"
    echo "$URL"
    xselection -replace PRIMARY "$URL"
}

Hanya pasangan. Saya dapat memposting lebih banyak lagi nanti, harus kembali bekerja!

Aaron Bockover
sumber
8
alias mk=makeLebih cepat mengetik dan kecil kemungkinannya salah. Atau kompilasi dari editor Anda menggunakan hotkey ...
Lars Haugseth
BTW Zsh memiliki koreksi ejaan internal yang sangat baik dalam mengoreksi kesalahan ketik sederhana.
Adam Byrtek
Juga di zsh, saya pikir defaultnya adalah ketika Anda menekan tombol atas itu melakukan pencarian sejarah seolah-olah Anda telah menekan ctrl r. Mungkin tidak menjadi default, tetapi ini adalah pengaturan.
Falmarri
Saya akan mempertimbangkan alias m=make, atau bahkan m=make -j6atau serupa - kecuali saya sudah menggunakan alias m=mutt
jmtd
31

diff output dari dua perintah tanpa membuat file sementara secara manual (bash):

diff <(ls dir1) <(ls dir2)
Alex B
sumber
Ini juga sangat berguna karena commhanya mengambil file, tetapi dalam banyak kasus itu membuang-buang inode.
Marcin
30

Cukup mendasar, tetapi orang-orang sepertinya tidak tahu, mengembalikan Anda ke dir sebelumnya:

cd -
Robert Swisher
sumber
Saya katakan, cd..dari DOS sudah tertanam dalam memori otot saya ...
LawrenceC
Ini adalah versi murah dari pushd dan popd ...
Robert Massaioli
Demikian pula, ada cd(tanpa argumen) yang akan membawa Anda ke direktori home Anda.
Mei
Ya, itu gila. Di mana di halaman manual yang menunjukkan perluasan '-'? Saya selalu berusaha (dan lupa) menggunakan pushd / popd
Chuck R
29

Ekspansi Brace :

Perluasan brace adalah mekanisme dimana string sewenang-wenang dapat dihasilkan.

Ini memungkinkan Anda untuk mengganti garis yang membosankan seperti:

mv loong/and/complex/file/name loong/and/complex/file/name.bacukup

dengan contoh yang lebih pendek

mv loong/and/complex/file/name{,backup}

beberapa kegunaan lain

# to display the diff between /etc/rc.conf and /etc/rc.conf.pacsave
diff /etc/rc.conf{,.pacsave}

# to list files in both /usr/share and /usr/local/share
ls /usr/{,local}/share 

Ekspansi Aritmatika :

Ekspansi aritmatika memungkinkan evaluasi ekspresi aritmatika dan penggantian hasilnya. Format untuk ekspansi aritmatika adalah:

$((expression))

Ekspresi diperlakukan seolah-olah itu dalam tanda kutip ganda, tetapi tanda kutip ganda di dalam tanda kurung tidak diperlakukan secara khusus. Semua token dalam ekspresi mengalami ekspansi parameter, ekspansi string, penggantian perintah, dan penghapusan kutipan. Ekspansi aritmatika mungkin bersarang.

$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
Stefan
sumber
3
Bagus, saya tidak percaya saya lupa tentang ini. Ada juga yang lebih kompak foo[123]yang akan diperluas ke foo1 foo2 foo3, tetapi mereka harus nama file untuk bekerja dalam kasus itu
Michael Mrozek
hehe .. terima kasih ... pelajari sesuatu setiap hari +1
Stefan
29

Ini biasanya dalam skrip startup saya (.bashrc, .profile, apa pun)

shopt Astaga, periksa komentarnya:

shopt -s cdspell        # try to correct typos in path
shopt -s dotglob        # include dotfiles in path expansion
shopt -s hostcomplete   # try to autocomplete hostnames

Alias ​​yang menyimpan penekanan tombol: mkdirdan cdke dalamnya:

mkcd () { mkdir -p "$@" && cd "$@"; }

Dan last but not least, saya sudah menyerah pada menghafal sintaks tar, jadi:

extract () {
    if [ -f $1 ] ; then
        case $1 in
            *.tar.bz2)  tar xjf $1      ;;
            *.tar.gz)   tar xzf $1      ;;
            *.bz2)      bunzip2 $1      ;;
            *.rar)      rar x $1        ;;
            *.gz)       gunzip $1       ;;
            *.tar)      tar xf $1       ;;
            *.tbz2)     tar xjf $1      ;;
            *.tgz)      tar xzf $1      ;;
            *.zip)      unzip $1        ;;
            *.Z)        uncompress $1   ;;
            *)          echo "'$1' cannot be extracted via extract()" ;;
        esac
    else
        echo "'$1' is not a valid file"
    fi
}
sygo
sumber
5
+1, mengapa saya tidak memikirkan itu? (ekstrak)
MAK
Saya memiliki fungsi yang mirip dengan mkcdyang saya beri nama id md. Namun menggunakan "$ @" sebagai argumen untuk cd tidak masuk akal karena Anda tidak dapat melakukan cd ke lebih dari satu direktori. "$ @" akan bekerja untuk mkdir, tetapi kemudian Anda menangani argumen secara berbeda untuk mkdir dan cd, jadi saya lebih suka menyarankanmd () { mkdir -p "$1"; cd "$1" }
hlovdal
bagaimana cara menambahkan perintah itu? cukup tempel seperti apa ke .bashrc atau tambahkan "alias" sebelum mereka?
Asaf
22

Dua fungsi bash yang menyelamatkan saya dari banyak goresan kunci.

Lakukan secara otomatis setelah setiap cd yang berhasil:

function cd {
    builtin cd "$@" && ls
}

Naik n level:

# Usage .. [n]
function .. (){
    local arg=${1:-1};
    local dir=""
    while [ $arg -gt 0 ]; do
        dir="../$dir"
        arg=$(($arg - 1));
    done
    cd $dir #>&/dev/null
}
Maik
sumber
4
Saya tidak pernah menyadari bahwa Anda dapat melakukannya builtin foountuk mendapatkan fungsi yang didefinisikan cd; Saya telah menggunakan chdirfungsi saya. Handy
Michael Mrozek
Luar biasa. Cukup tambahkan -F ke ls di fungsi cd dan itu sempurna (untuk saya)!
frabjous
2
Saya melakukan hal yang sama seperti Anda untuk cd, tetapi saya memiliki beberapa pemeriksaan kewarasan dan menghindari melakukan ls dalam mode non-interaktif:cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
jmtd
17

Karena saya biasanya setengah jalan ke baris perintah sebelum ingin mencari (CTRL-R di bash) saya punya yang berikut di .bashrc saya

bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward

Ini berarti bahwa jika saya mengetik cd maka tekan atas / bawah saya dapat melihat semua opsi yang saya punya cd. Pada dasarnya saya menggunakan ini untuk dirs yang sering digunakan. Seperti "cd w" dan saya akhirnya melalui semua ruang kerja yang saya gunakan banyak.

miskin
sumber
Yang ini sangat bagus! Itu memperluas perilaku panah tanpa merusak fungsi dasar mereka. Terima kasih!
philfr
17

Satu hal yang menghemat banyak waktu adalah perintah pushd / popd. Orang-orang ini memungkinkan Anda membuat tumpukan direktori dan mengurangi banyak mengetik:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make
jacksonh
sumber
2
Iya! alias u = pushd; alias o = popd
cannedprimates
2
.. dan apa yang dilakukan udan oberdiri di sini?
deizel
@deizel: Tidak ada yang spesifik, hanya jalan pintas untuk menghindari mengetik.
Adam Byrtek
2
Sepertinya huruf kedua dari perintah, karena keduanya mulai dengan p, Anda tidak dapat menggunakannya untuk keduanya.
camh
Di ZSH Anda dapat setopt autopushddan semua perubahan direktori akan mendorong secara otomatis
Michael Mrozek
14

The screen perintah . Ini pada dasarnya menyimpan sesi baris perintah Anda ketika Anda kembali. Ini semacam manajer terminal, seperti manajer jendela. Dengan begitu, dalam satu sesi terminal, Anda dapat memiliki beberapa terminal virtual. Keren sekali.

Jika digunakan screen, fungsi shell ini ( .bashrcsangat bermanfaat):

function scr {
    if screen -ls | grep -q Main; then
         # reattach to Main: 
         screen -xr Main
    else
         # name session "Main":
         screen -S Main
    fi
   }

saat mengetik scr, itu akan memeriksa apakah sesi utama Anda ada dan akan melampirkannya. Kalau tidak, itu akan membuatnya.

Sebastian
sumber
secara teknis, ini adalah programnya sendiri, bukan "perintah".
unperson325680
1
Saya akan merekomendasikan tmux atau dvtm di layar. Mereka lebih modern dan penggantian yang lebih bersih.
deltaray
Ya, "tmux" jauh lebih baik daripada layar.
ColinM
Itu juga lebih dekat mengikuti konvensi unix unintuitive, disingkat :)
user394
13

Jika Anda perlu mengedit baris perintah yang sangat panjang di bash

^X^E (Ctrl-X Ctrl-E) 

akan membukanya di editor ($ EDITOR).

Di zsh Anda bisa mendapatkan perilaku yang sama dengan menambahkan ini ke .zshrc:

autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line 
dihapus
sumber
Wow, yang masuk ke dalam The Book.
l0b0
Ya, dan ke dalam catatan saya!
jyz
12

Jika Anda seorang pengetik cepat, ini berguna:

alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'

Makro ini membantu Anda menghitung total kolom output: ukuran file, byte, paket, yang harus Anda lakukan adalah menentukan kolom yang ingin Anda tambahkan:

total ()
{
        if [ x$1 = x ]; then set `echo 1`; fi
        awk "{total += \$$1} END {print total}"
}

Anda menggunakannya seperti ini misalnya, tanpa argumen, itu menambah total kolom pertama:

du | total

Jika Anda memberikan argumen, itu akan menjumlahkan kolom itu, misalnya, ini memberi Anda jumlah total byte yang digunakan oleh semua file C # di / tmp:

ls -l /tmp/*cs | total 5

Kadang-kadang konsol Anda menjadi kacau karena Anda secara tidak sengaja melihat file biner (cat / bin / ls misalnya), Anda dapat memulihkan terminal dengan fungsi shell ini:

restaura ()
{
    perl -e 'print "\e)B";'
}

Saya suka ls saya menggunakan karakter untuk membedakan kelas file, dan juga untuk menyembunyikan file cadangan yang dihasilkan oleh editor saya (file cadangan diakhiri dengan ~ karakter):

alias ls='ls -FB'
miguel.de.icaza
sumber
Jangan lupa: alias gerp = 'grep --color = tty' Saya melakukan itu sepanjang waktu ;-)
Robert Swisher
1
Sejauh yang saya ketahui, "cepat" tidak masuk hitungan jika saya tidak akurat. Anda mungkin juga ingin melihat variabel GREP_COLORS dan GREP_OPTIONS.
Andy Lester
2
s/fast/sloppy/
Josh
1
Saya menggunakan resettempat Anda gunakan restaura.
jmtd
11
alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.

Salah satu favorit saya ketika saya lupa s:

$ s !! # last command with super user priviledges
Eimantas
sumber
2
Jika Anda menggunakan ZSH, Anda dapat melakukan sesuatu seperti bindkey -s '\e[12~' "sudo !!\n"mengikat (dalam hal ini) F2 untuk menjalankan perintah itu. Saya memiliki ikatan itu, jadi ketika saya menjalankan sesuatu dan melihat pesan kesalahan "Anda lupa 'sudo', bodoh", saya bisa menusuk F2 dengan kesal
Michael Mrozek
Kunci F2 yang buruk ....)
Eimantas
Saya menggunakan ini sepanjang waktu. Saya selalu lupa mengetik sudo sebelum mengedit file host saya. Jika itu terjadi, saya jalankan sudo !!. +1
Brian Wigginton
10

Jika suatu perintah mengambil input stdin, Anda dapat membaca input dari file dengan <filename. Ini bisa muncul di mana saja di perintah, jadi baris ini setara:

cat filename
cat <filename
<filename cat

Ini sangat berguna untuk grep, karena memungkinkan Anda untuk menempatkan ekspresi di akhir baris, sehingga Anda dapat dengan cepat memodifikasi perintah grep dengan memukul Up, tanpa perlu menggulir ke kiri untuk melewati nama file:

<filename grep 'expression'
Michael Mrozek
sumber
3
Tip yang bagus! Perlu dicatat bahwa ini sebenarnya tidak menyusun ulang argumen untuk perintah. Sebaliknya itu mem-pipe file ke dalam proses 'STDIN, karena grep sekarang tidak memiliki argumen file yang default untuk dibaca dari STDIN. Memahami hal ini akan membuka banyak peluang untuk menggunakan teknik ini dengan perintah lain dan juga membantu orang untuk memahami apa yang terjadi ketika segalanya tidak berjalan seperti yang diharapkan. Untuk info lebih lanjut lihat pipa dan pengalih arah: dsj.net/compedge/shellbasics1.html
chillitom
@tunggu poin bagus; ujungnya sebenarnya diutarakan dengan sangat buruk sehingga pada dasarnya salah. Saya menulis ulang berdasarkan komentar Anda
Michael Mrozek
Sesuatu yang saya temukan baru-baru ini: Anda dapat mengarahkan input ke loop (untuk, sementara, dll.). Lihat faqs.org/docs/abs/HTML/redircb.html .
Lucas Jones
Secara konvensional Anda menempatkan pengalihan pada akhirnya. Sementara metafora pipa terlihat lebih baik <input foo | bar | baz >output, itu tidak berfungsi jika Anda mencoba mencampur beberapa primitif perulangan shell seperti whileatau fordi tengah. Jadi saya menyerah dan hanya meletakkannya di akhir sesuai konvensi.
jmtd
@ jmtd Baiklah, menaruhnya di akhir menghilangkan "Ini sangat berguna untuk grep, karena memungkinkan Anda untuk menempatkan ekspresi di akhir baris, sehingga Anda dapat dengan cepat memodifikasi perintah grep dengan menekan, tanpa perlu menggulir Sisa untuk melewati nama file "
Michael Mrozek
9

Anda dapat menggunakan CDPATHuntuk mengatur direktori yang setara dengan PATH; jika Anda mencoba cd foodan tidak ada foodalam direktori saat ini, shell akan memeriksa setiap direktori yang CDPATHdicari foodi dalamnya, dan beralih ke yang pertama ditemukan:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
Michael Mrozek
sumber
3
Ini dapat menyebabkan masalah. Lihat softpanorama.org/Scripting/Shellorama/cdpath.shtml "Jika $ CDPATH diset, cd built-in tidak akan secara implisit menambahkan direktori saat ini ke dalamnya. Ini berarti bahwa cd akan gagal jika tidak ada nama direktori yang valid dapat dibangun dari sembarang dari entri dalam $ CDPATH, bahkan jika direktori dengan nama yang sama dengan nama yang diberikan sebagai argumen ke cd ada di direktori saat ini. " Saya telah digigit oleh ini, beberapa Makefile berhenti bekerja. Menambahkan secara eksplisit mungkin membantu, tetapi ada beberapa masalah dengan itu juga.
ustun
9
vi `which scriptname`

Karena ketika Anda tidak tahu di mana sesuatu tinggal, dan Anda juga tidak peduli.

Matt Simmons
sumber
8
Saya tidak bermaksud untuk terus memasukkan fitur ZSH, tetapi saya terus memikirkan mereka sebagai jawaban orang lain :). Di ZSH Anda dapat melakukan = foo untuk memohon whichsecara otomatis, jadivi =scriptname
Michael Mrozek
Jika Anda kesulitan mencari karakter backtick yang dapat Anda gunakan$(scriptname)
Patrick
9

The ampersand . Ini menempatkan perintah Anda di latar belakang, sehingga Anda dapat melanjutkan mengetik.

$> sudo updatedb &

Bekerja bersama, dan setelah beberapa saat Anda melihat:

[1] 17403

Dan proses Anda selesai! Sangat bagus untuk hal-hal di mana Anda tidak perlu menunggu mereka berakhir.

pengguna394
sumber
11
Dan jika aplikasi Anda adalah GUI, Anda mungkin tidak ingin itu tetap bekerja. Tambahkan &!ke latar belakang pekerjaan dan singkirkan dari shell!
unperson325680
@progo: Itu tidak berhasil bagi saya bash.
Nathan Osman
@George. Sepertinya Anda benar. Saya mengetahui bahwa zsh mendukungnya, dan kemudian saya mendengar bahwa bash juga mendukungnya. Oh my :(
unperson325680
1
@progo: Ternyata menambahkan perintah dengan nohupmenyelesaikan ini.
Nathan Osman
8

Tab selesai . Seberapa burukkah itu jika Anda harus mengetikkan semua karakter dari setiap jalur?

pengguna394
sumber
5
Ada linux bunuh diri. Jika Anda salah mengetik perintah - ya rm -fr /. Jadi ya, penyelesaian Tab sangat penting ...
Eimantas
Tidak seburuk yang Anda kira (tetapi masih buruk), Anda hanya menaburkan wildcard di mana-mana:ls /usr/lib/game-d*/rott*
jmtd
@Eimantas Tidak rm -rf /dinonaktifkan di sebagian besar sistem Linux?
Bernhard Heijstek
@ phycker - Saya menyebutkan Suicide Linux, bukan "semua".
Eimantas
7

Umount perangkat yang terakhir dipasang:

mount /media/whatever
...
u!mo

!momemperluas ke perintah terakhir yang dimulai dengan mo(setidaknya dalam bash). Terkadang seseorang melakukannya mvdi tengah, jadi u!mtidak akan bekerja sesering mungkin.

Roberto Bonvallet
sumber
Gunakan Ctrl + Shift + 6 (Ctrl + ^) untuk memperluas perintah tanpa menjalankannya sebagai tindakan pencegahan keamanan
ColinM
7

Saya memiliki ini di .bashrc saya

#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'

 

function find-all() {
    python -c "import re
import sys
for i in re.findall('$1', sys.stdin.read()):
    if type(i) == type(''):
        print i
    else:
        print i[0]"
}

Dan ketika saya memiliki kode sumber html di clipboard dan ingin menemukan semua tautan yang saya gunakan

c-v | find-all 'href="([^"]*)"' | c-c

Dan saya memiliki semua url di clipboard

Saya juga punya fungsi ini

function lsq(){
    ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}

yang ukuran tampilan (dapat dibaca manusia) dan nama file.

alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'

alias ini untuk acara temerature

function separate() {
    python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}

dengan fungsi ini saya dapat menghitung produk atau jumlah argumen.

alias sum='separate + | bc'
alias product='separate * | bc'

function split-join() {
    python -c "import sys,re; print '$2'.join(re.split('$1', sys.stdin.read().strip()))";
}

Ini adalah fungsi yang berguna yang membagi input standar dipisahkan oleh regex dan kemudian bergabung dengan hasilnya.

function factorial() {
    seq -s* $1 | bc
}

fungsi faktorial

function wiki() { dig +short txt $1.wp.dg.cx; }

Fungsi ini menampilkan teks wiki melalui DNS

Saya juga memiliki tiga fungsi warna

function blue() {
    echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m";
}

function green() {
    echo -e "\x1b[32m\x1b[1m"$@"\x1b[0m";
}

function red() {
    echo -e "\x1b[31m\x1b[1m"$@"\x1b[0m";
}

 

function md5check() {
    test `md5sum $2 | cut -d' ' -f1` = "$1" && green [OK] || red [FAIL]
}

Fungsi ini memvalidasi hash file md5.

ini akan menampilkan pesan kesalahan untuk kode yang diberikan

function strerror() { python -c "import os; print os.strerror($1)"; }

Anda dapat mencetak semua pesan dengan

alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
jcubic
sumber
6

Trik ZSH lain yang bermanfaat:

Perlakukan output dari perintah sebagai file:

emacs =(hg cat -r 100 somefile)

Ini membuka versi lama file Mercurial-dilacak di emacs untuk melihat sintaks yang disorot. Tanpa itu, saya harus dipusingkan dengan hg revert, hg archiveatau secara eksplisit mengirim hg catoutput ke file sementara.

Tentu saja, ini berfungsi dengan program apa pun yang membuka file, dan program apa pun yang mencetak ke output standar.

Matthew Flaschen
sumber
5
Anda dapat melakukan ini di bash dengan <()
ScaryAardvark
5

Sebuah fitur zsh-spesifik alias akhiran, ditetapkan dengan memberikan aliaspara -sbendera:

alias -s ext=program

Jika ekstensi yang diberikan memiliki alias suffix, Anda dapat menjalankan file dengan ekstensi itu secara langsung, dan ZSH akan meluncurkan program yang diberikan dan meneruskan nama file sebagai argumen. Jadi, jika alias di atas berlaku, garis-garis ini setara:

/path/to/foo.ext
program /path/to/foo.ext
Michael Mrozek
sumber
Ini adalah satu hal yang saya sangat rindukan tentang Windows ... sampai saya menyadari bahwa "program" selalu emacs, jadi saya berhenti menggunakan shell untuk membuka file dan hanya menggunakan Cx Cf (duh).
harpo
5

Salah satu fitur ZSH favorit saya sepanjang masa adalah bernama direktori. Anda bisa mengekspor variabel dengan nama yang diberikan, dengan nilai yang menunjuk ke jalur tertentu:

export foo=/usr/bin

Sekarang Anda dapat menggunakan ~fooperintah untuk merujuk ke /usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename
Michael Mrozek
sumber
jika prompt Anda menampilkan direktori aktif saat ini, nama-nama variabel juga akan digunakan di sana sejauh yang saya ingat.
Andre Holzner
4

Lihat pertanyaan ini .

Ketika Anda menjalankan ps ax | grep string:

[steve@sage-arch ~]$ ps ax | grep 'openbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 5100 pts/0    S+     0:00 grep openbox

baris terakhir berisi grepsesuatu yang agak mengganggu

Anda dapat membebaskan diri dari hal ini dengan menjalankan ps ax | grep '[s]tring':

[steve@sage-arch ~]$ ps ax | grep '[o]penbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session

perbarui : atau jalankan sajapgrep string

Stefan
sumber
ya, sangat bermanfaat. Anda harus mengutip openbox ( '[o]penbox'). Tanda kurung akan berfungsi sebagai semacam bola, jadi jika ada openbox di direktori Anda (misalkan Anda berada /usr/bin) bash hanya akan menggunakan openbox, yang akan mencegah trik grep.
Rich Homolka
4
  • Perintah do-nothing :seperti pada

    while :; do :; done
  • Perluasan brace dalam kombinasi dengan untuk loop:

    for c in {1..3}; do :; done
  • !operator dan operator hubungan arus pendek ||dan&&

    [ -d /tmp/dir ] || mkdir /tmp/dir
    
    if ! ping 34.41.34.1; then :; fi
  • menggunakan sub shell bukannya pop / push (berguna dalam skrip)

    ~$ ( cd /tmp; echo $PWD )
    /tmp
    ~$
  • jenis- apa-apa perintahtype

    ~$ type type
    type is a shell builtin
    ~$ type ls
    ls is aliased to `ls --color=auto'
    ~$ f(){ :; }
    ~$ type f
    f is a function
    f () 
    { 
         :
    
    }
  • juga sangat bagus: di sini-string

    ~$ cat <<<"here $PWD"
    here /home/yourname
    ~$
  • dan favorit saya: pengalihan pada daftar perintah

    { w; ps; ls /tmp; } 2>/dev/null |less
artistoex
sumber
3

Saya suka membuang barang sebanyak yang saya bisa ke PS1 saya. Beberapa hal berguna untuk diingat:

\e[sdan \e[usimpan dan hapuskan posisi kursor masing-masing. Saya menggunakan ini untuk membuat 'info-bar' di bagian atas layar, panjang beberapa baris, yang dapat memuat lebih banyak barang. Contoh:

PS1='\[\e[s\e[7m\e[1;1H\]\w\n\t        \j / \! / \#\[\e[u\e[0m\e[33;1m\][\u@\h \[\e[34m\]\W]\[\e[0m\]\$ '

Kombinasikan dengan alias clear='echo -e "\e[2J\n"'. Cobalah!

Juga, PROMPT_COMMANDvariabel mendefinisikan perintah untuk dieksekusi sebelum PS1 setiap kali.

Satu lagi adalah bgperintah. Jika Anda lupa untuk meletakkan &di akhir perintah, cukup tekan ^Zdan ketik bg, dan itu berjalan di latar belakang.

Lucas Jones
sumber
terima kasih untuk bg, ketika saya memiliki program yang berjalan di latar belakang dan secara tidak sengaja menekan fgsaya tidak tahu bagaimana mendorongnya kembali: D
phunehehe
Saya suka pembersih PS1jadi saya memasukkan sebagian besar barang yang saya inginkan ke dalam layar saya ...
Josh