Các tính năng hoặc thủ thuật dòng lệnh yêu thích của bạn là gì?


94

Chia sẻ các tính năng và thủ thuật dòng lệnh của bạn cho Unix / Linux. Cố gắng giữ cho nó vỏ / distro bất khả tri nếu có thể. Quan tâm đến việc xem bí danh, một lớp, phím tắt, tập lệnh shell nhỏ, v.v.

Câu trả lời:


89

Điều này mở rộng phần nào về !!thủ thuật được đề cập trong câu trả lời này . Thực tế, có một loạt các lệnh liên quan đến lịch sử có xu hướng bị lãng quên (mọi người có xu hướng đâm Up100 lần thay vì tìm kiếm một lệnh mà họ biết họ đã gõ).

  • Các historylệnh sẽ hiển thị một danh sách các lệnh vừa chạy với một vấn thiết kế sự kiện sang trái
  • !N sẽ thay thế lệnh liên quan đến chỉ định sự kiện N
  • !-Nsẽ thay thế các N thứ lệnh gần nhất; ví dụ: !-1sẽ thay thế lệnh gần đây nhất, lệnh gần đây !-2thứ hai, v.v.
  • Như đã đề cập trong câu trả lời khác, !!là viết tắt !-1, để nhanh chóng thay thế lệnh cuối cùng
  • !string sẽ thay thế lệnh gần đây nhất bắt đầu bằng string
  • !?string? sẽ thay thế lệnh gần đây nhất có chứa string

Trình chỉ định từ có thể được thêm vào !lệnh lịch sử để sửa đổi kết quả. Một dấu hai chấm ngăn cách các sự kiện và từ chỉ định, ví dụ !!:0. Trình chỉ định sự kiện !!có thể được viết tắt chỉ !khi sử dụng một từ chỉ định, do đó !!:0tương đương với !:0.

  • !:0 sẽ nhận được lệnh đã được thực thi
  • !:1sẽ nhận được đối số đầu tiên (và !:2thứ hai, v.v.)
  • !:2-3 sẽ nhận được các đối số thứ hai và thứ ba
  • !:^là một cách khác để có được đối số đầu tiên. !:$sẽ nhận được cuối cùng
  • !:*sẽ nhận được tất cả các đối số (nhưng không phải là lệnh)

Công cụ sửa đổi cũng có thể được thêm vào một !lệnh lịch sử, mỗi tiền tố được bắt đầu bằng dấu hai chấm. Bất kỳ số nào có thể được xếp chồng lên nhau (ví dụ !:t:r:p).

  • h - Sắp xếp theo tên tệp cơ sở
  • t - Chỉ tên tệp cơ sở
  • r - Xếp hàng đến phần mở rộng tên tệp
  • e - Chỉ phần mở rộng tên tệp
  • s/search/replacement- Thay thế lần xuất hiện đầu tiên searchbằngreplacement
  • gs/search/replacement- Thay thế tất cả các lần xuất hiện searchbằngreplacement

3
Và nếu bạn đang sử dụng Bash (có thể giống với một số shell khác), M- ^ (Meta- ^) sẽ mở rộng các toán tử mở rộng lịch sử ở trên cho bạn, chỉ trong trường hợp bạn muốn xem những gì bạn thực sự đang đề cập đến.
Eric Smith

1
Tôi chưa bao giờ tìm thấy một sử dụng cho! chỉ huy điều. Nó có vẻ tệ đối với tôi để chạy một lệnh mà tôi không thấy. Thật dễ dàng để gõ! -3 thay vì! -4, và ai biết điều gì có thể xảy ra. Tìm số dòng của lệnh tôi muốn chạy thường là một nỗi đau hơn giá trị của nó. Mặc dù vậy, nhưng tôi chưa bao giờ tìm thấy một công dụng thực sự cho chúng.
Falmarri

1
@Falmarri Tôi cũng không bao giờ sử dụng !-#cái đó. Tôi thường sử dụng !stringđể chạy lệnh cuối cùng bắt đầu bằng chuỗi, nhưng tôi thường hoàn thành tab trước (zsh) để đảm bảo rằng tôi đang chạy đúng
Michael Mrozek

1
Không! :) "Chạy !Nsẽ chạy lệnh ..." là một mô tả quá hẹp; thực tế, !Nsẽ được thay thế bằng lệnh ...; và như vậy cho tất cả các mô tả trong câu trả lời. Chính xác hơn và mở ra nhiều khả năng hữu ích hơn nhiều! Ví dụ, các đề cập sudo !!.
imz - Ivan Zakharyaschev

1
Để chạy các lệnh trước đó được tìm kiếm bởi một chuỗi, tôi thường chỉ cần nhấn Ctrl-R. Nhiều Ctrl-R sẽ đào sâu hơn vào lịch sử. Bằng cách này, tôi thấy lệnh được tìm thấy ngay lập tức, và có thể loại bỏ nó và nhìn xa hơn. Ctrl-G thoát khỏi chế độ này. Sự bất tiện duy nhất là Ctrl-R dành cho bash; trong Emacs, để duyệt qua lịch sử của các lệnh và giá trị đầu vào (đối với Mx hoặc các giá trị đọc khác), người ta sử dụng Meta-R thay thế (Meta-R cũng được sử dụng eshelltrong Emacs). Vì vậy, tôi thường làm phiền họ.
imz - Ivan Zakharyaschev

65

bash - chèn tham số cuối cùng của dòng trước

alt- . tổ hợp phím hữu ích nhất từ ​​trước đến nay, hãy thử và xem, vì một số lý do không ai biết về cái này.

nhấn nó một lần nữa và một lần nữa để chọn các tham số cuối cùng cũ hơn.

thật tuyệt khi bạn muốn làm gì đó hơn với đối số / tệp bạn đã sử dụng chỉ một lúc trước.


11
Bạn cũng có thể sử dụng! $ Để tham chiếu đến đối số cuối cùng trong lệnh trước đó. Điều này rất hữu ích vì nó hoạt động trong các kịch bản cũng như tương tác. (Hoạt động trong bash & zsh)

4
Mỗi lần bạn nhấn alt- .nó sẽ chuyển đến lệnh trước đó và lấy đối số cuối cùng từ nó. Vì vậy, nếu bạn muốn đối số cuối cùng từ ba lệnh trước, chỉ cần nhấn alt- .ba lần.
clee

2
Đây là ràng buộc khóa mặc định cho yank-last-arglệnh readline, vì vậy nó sẽ hoạt động với bất kỳ chương trình nào được liên kết với đường đọc, không chỉ BASH hoặc ZSH.
James Sneeringer

Trong chế độ vi, tôi phải khởi động lại yank-last-arg theo câu trả lời này: superuser.com/questions/18498/
Kẻ

Trong xterm, meta-. tạo ®, nhưng bạn có thể sử dụng esc thay vì meta (nói chung trong bash), vì vậy esc-. thay thế.
derobert

49

Sở thích của tôi là

man 7 ascii

Đơn giản và rất hữu ích.

   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

Có một cái nhìn vào trang web này linelinefu.com .

Bạn cũng có thể xem bốn bài viết này của Peteris Krumins trên blog của mình


2
ascii Chương trình riêng biệt cũng hữu ích. Bên cạnh việc in một bảng, nó cho phép bạn truy vấn một hoặc nhiều ký tự riêng lẻ.
Matthew Flaschen


42

Không chắc chắn nếu điều này được tính là một "mánh khóe", nhưng mọi người dường như rất không biết về các phím nóng đọc tiêu chuẩn. Sử dụng đặc biệt trong vỏ:

  • Ctrl+ U- Cắt dòng hiện tại
  • Ctrl+ Y- Dán một đường cắt bằng Ctrl+U
  • Ctrl+ L- Xóa màn hình và vẽ lại dòng hiện tại
  • Ctrl+ G- Nhận một dòng mới và từ bỏ dòng hiện tại

5
Chỉ cần thêm một vài thứ vào đây: Ctrl + A để đi đến đầu dòng, Ctrl + E để đi đến cuối dòng, Ctrl-K để xóa từ con trỏ đến cuối dòng.
rsuarez

Ctrl+Ltương ứng với ký tự FormFeed ascii. Nó thường sẽ vẽ lại màn hình trong các ứng dụng văn bản bằng một cửa sổ màn hình (ví dụ: vim, less, mc, v.v.). Thật tuyệt nếu màn hình đã bị "ô nhiễm" bởi một số đầu ra từ một chương trình khác.
hlovdal

Thêm vào danh sách các phím nóng: Ctrl+Wđể cắt ngược một từ, Alt+Fchuyển tiếp một từ, Alt+Bchuyển ngược một từ trong một dòng. Tôi thích Ctrl+YShift+Insertbởi vì bạn có thể có hai dòng sao chép. Một với Ctrl+U(dán nó với Ctrl+Y) và đồng thời bạn có thể sao chép một từ khác (chọn dòng) dán bằng ( Shift+Insert).

36

CTRL+ Rtrong BASH để tìm kiếm / kích hoạt các lệnh đã thực hiện trước đó (nội dung của ~ / .bash_history).

Điều này thường cực kỳ hữu ích. Chạy bí danh này sẽ phục vụ PWD lên trên HTTP (được lập chỉ mục) trên cổng 8000:

alias webserver="python -m SimpleHTTPServer"

Và bởi vì tôi chạy mọi lúc, và thoát ra và gõ quá nhanh, những bí danh này có lẽ là thứ được tôi sử dụng nhiều nhất (nghiêm túc):

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

Và có lẽ phần BASH được sử dụng thường xuyên nhất của tôi là một tập lệnh đơn giản mà tôi gọi là tải lên. Tôi sử dụng nó để làm mờ bất kỳ loại nội dung nào vào Linode của mình và nó sao chép URL HTTP kết quả vào bảng tạm của tôi (nhấp chuột giữa). Rất hữu ích để dán công cụ cho những người ở IRC:

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

Chỉ là một đôi. Tôi có thể đăng nhiều hơn sau đó, phải trở lại làm việc!


8
alias mk=makeNhanh hơn để gõ và ít có khả năng nhận được sai. Hoặc biên dịch từ trình chỉnh sửa của bạn bằng phím nóng ...
Lars Haugseth

BTW Zsh được tích hợp sửa lỗi chính tả rất tốt trong việc sửa lỗi chính tả đơn giản.
Adam Byrtek

Ngoài ra trong zsh, tôi nghĩ mặc định là khi bạn nhấn phím lên, nó thực hiện tìm kiếm lịch sử như thể bạn đã nhấn ctrl r. Có thể không phải là mặc định, nhưng đó là một thiết lập.
Falmarri

Tôi sẽ xem xét alias m=make, hoặc thậm chí m=make -j6hoặc tương tự - ngoại trừ tôi đã sử dụng alias m=mutt
jmtd

31

diff đầu ra của hai lệnh mà không tạo tệp tạm thời theo cách thủ công (bash):

diff <(ls dir1) <(ls dir2)

Điều này cũng siêu hữu ích commvì nó chỉ lấy các tệp, nhưng trong rất nhiều trường hợp, đó là sự lãng phí của các nút.
Marcin

30

Khá cơ bản, nhưng mọi người dường như không biết, sẽ đưa bạn trở lại thư mục trước:

cd -

Tôi nói với bạn, cd..từ DOS đã ăn sâu vào trí nhớ cơ bắp của tôi ...
LawrenceC

Đây là phiên bản rẻ tiền của Pushd và popd mặc dù ...
Robert Massaioli

Tương tự, có cd(không có đối số) sẽ đưa bạn đến thư mục chính của bạn.
Mei

Vâng, thật điên rồ. Ở đâu trong trang man, nó hiển thị sự mở rộng của '-'? Tôi luôn cố gắng (và quên) sử dụng Pushd / popd
Chuck R

29

Mở rộng cú đúp :

Mở rộng cú đúp là một cơ chế theo đó các chuỗi tùy ý có thể được tạo ra.

Nó cho phép bạn thay thế các dòng tẻ nhạt như:

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

với một ví dụ ngắn hơn

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

một số công dụng khác

# 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 

Mở rộng số học :

Mở rộng số học cho phép đánh giá biểu thức số học và thay thế kết quả. Định dạng để mở rộng số học là:

$((expression))

Biểu thức được xử lý như thể nó nằm trong dấu ngoặc kép, nhưng trích dẫn kép bên trong dấu ngoặc đơn không được xử lý đặc biệt. Tất cả các mã thông báo trong biểu thức trải qua mở rộng tham số, mở rộng chuỗi, thay thế lệnh và xóa trích dẫn. Mở rộng số học có thể được lồng nhau.

$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5

3
Thật tuyệt, tôi không thể tin rằng tôi đã quên điều này. Ngoài ra còn có một bản nhỏ gọn hơn foo[123]sẽ mở rộng ra foo1 foo2 foo3, nhưng chúng cần phải là tên tệp để hoạt động trong trường hợp đó
Michael Mrozek

hehe .. cảm ơn ... học một cái gì đó mỗi ngày +1
Stefan

29

Điều này thường có trong tập lệnh khởi động của tôi (.bashrc, .profile, sao cũng được)

shopt tốt, kiểm tra các ý kiến:

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

Một bí danh lưu tổ hợp phím: mkdircdvào đó:

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

Và cuối cùng nhưng không kém phần quan trọng, tôi đã từ bỏ việc ghi nhớ cú pháp tar, vì vậy:

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
}

5
+1, tại sao tôi không nghĩ về điều đó? (trích)
MAK

Tôi có một chức năng tương tự mkcdchỉ tôi đặt tên id md. Tuy nhiên, việc sử dụng "$ @" làm đối số cho cd không có nghĩa gì vì bạn không thể cd vào nhiều hơn một thư mục. "$ @" sẽ hoạt động cho mkdir, nhưng sau đó bạn đang xử lý các đối số khác nhau cho mkdir và cd, vì vậy tôi muốn đề xuấtmd () { mkdir -p "$1"; cd "$1" }
hlovdal 17/03/2016

Làm thế nào để tôi thêm các lệnh đó? chỉ cần dán như là .bashrc hoặc thêm "bí danh" trước chúng?
Asaf

22

Hai hàm bash giúp tôi tiết kiệm nhiều nét chính.

Tự động làm một ls sau mỗi cd thành công:

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

Tăng n cấp:

# Usage .. [n]
function .. (){
    local arg=${1:-1};
    local dir=""
    while [ $arg -gt 0 ]; do
        dir="../$dir"
        arg=$(($arg - 1));
    done
    cd $dir #>&/dev/null
}

4
Tôi không bao giờ nhận ra bạn có thể làm gì builtin foođể có được một chức năng được xác định cd; Tôi đã sử dụng chdirchức năng của mình. Tiện dụng
Michael Mrozek

Tuyệt vời. Chỉ cần thêm -F vào ls trong chức năng cd và nó hoàn hảo (đối với tôi)!
frabjous

2
Tôi cũng làm như bạn với cd, nhưng tôi có thêm một vài lần kiểm tra sự tỉnh táo và tránh làm ls ở chế độ không tương tác:cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
jmtd

17

Vì tôi thường đi được một nửa vào dòng lệnh trước khi muốn tìm kiếm (CTRL-R trong bash), tôi có phần sau trong .bashrc của mình

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

Điều này có nghĩa là nếu tôi gõ cd rồi nhấn lên / xuống tôi có thể thấy tất cả các tùy chọn mà tôi có cd'd. Về cơ bản tôi sử dụng điều này cho các dir thường được sử dụng. Giống như "cd w" và cuối cùng tôi sẽ trải qua tất cả các không gian làm việc tôi sử dụng.


Điều này là thực sự tuyệt vời! Nó mở rộng hành vi mũi tên mà không phá vỡ chức năng cơ bản của chúng. Cảm ơn!
philfr

17

Một điều giúp tôi tiết kiệm rất nhiều thời gian là các lệnh Pushd / popd. Những kẻ này cho phép bạn tạo một chồng thư mục và giảm việc gõ rất nhiều:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make

2
Đúng! bí danh u = đẩy; bí danh o = popd
cannedprimates

2
.. và những gì làm uođứng cho ở đây?
deizel

@deizel: Không có gì cụ thể, chỉ là một phím tắt để tránh gõ.
Adam Byrtek

2
Trông giống như chữ cái thứ hai của lệnh, vì cả hai đều bắt đầu bằng p, bạn không thể sử dụng nó cho cả hai.
camh

Trong ZSH, bạn có thể setopt autopushdvà tất cả các thay đổi thư mục sẽ tự động đẩy
Michael Mrozek

14

Các screen lệnh . Về cơ bản, nó lưu phiên dòng lệnh của bạn khi bạn quay lại. Nó là một trình quản lý đầu cuối, giống như một trình quản lý cửa sổ. Bằng cách đó, trong một phiên thiết bị đầu cuối duy nhất, bạn có thể có nhiều thiết bị đầu cuối ảo đang diễn ra. Nó rất tuyệt

Nếu một người sử dụng screen, hàm shell này (đặt nó vào .bashrc) cực kỳ hữu ích:

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

khi gõ scr, nó sẽ kiểm tra xem phiên chính của bạn có tồn tại hay không và sẽ đính kèm với nó. Nếu không nó sẽ tạo ra nó.


về mặt kỹ thuật, đây là một chương trình của riêng nó, không phải là "lệnh".
unperson325680

1
Tôi muốn giới thiệu tmux hoặc dvtm trên màn hình. Họ là những thay thế hiện đại và sạch sẽ hơn.
deltaray

Có, "tmux" tốt hơn nhiều so với màn hình.
ColinM

Nó cũng theo sát hơn quy ước unix của các tên viết tắt, không trực quan :)
user394

13

Nếu bạn cần chỉnh sửa một dòng lệnh đặc biệt dài trong bash

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

sẽ mở nó trong trình chỉnh sửa ($ EDITOR).

Trong zsh, bạn có thể có hành vi tương tự bằng cách thêm phần này vào .zshrc:

autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line 

Wow, cái đó đi vào Cuốn sách.
l0b0

Vâng, và vào ghi chú của tôi!
jyz

12

Nếu bạn là một người đánh máy nhanh, những thứ này có ích:

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

Macro này giúp bạn tính tổng các cột của đầu ra: kích thước tệp, byte, gói, tất cả những gì bạn phải làm là chỉ định cột mà bạn muốn thêm:

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

Bạn sử dụng nó như thế này chẳng hạn, không có đối số, nó thêm tổng số cột đầu tiên:

du | total

Nếu bạn cung cấp đối số, nó sẽ tính tổng cột đó, ví dụ, điều này cung cấp cho bạn tổng số byte được sử dụng bởi tất cả các tệp C # trong / tmp:

ls -l /tmp/*cs | total 5

Đôi khi bảng điều khiển của bạn bị rối vì bạn vô tình xem tệp nhị phân (ví dụ cat / bin / ls), bạn có thể khôi phục thiết bị đầu cuối với chức năng shell này:

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

Tôi thích ls của tôi sử dụng các ký tự để phân biệt lớp tệp và cũng để ẩn các tệp sao lưu được tạo bởi trình soạn thảo của tôi (tệp sao lưu kết thúc bằng ký tự ~):

alias ls='ls -FB'

Đừng quên: alias gerp = 'grep --color = tty' Tôi làm điều đó mọi lúc ;-)
Robert Swisher

1
Theo như tôi quan tâm, "nhanh" sẽ không được tính nếu tôi không chính xác. Bạn cũng có thể muốn xem xét các biến GREP_COLORS và GREP_OPTIONS.
Andy Lester

2
s/fast/sloppy/
Josh

1
Tôi sử dụng resetnơi bạn sử dụng 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.

Một trong những sở thích của tôi khi tôi quên s:

$ s !! # last command with super user priviledges

2
Nếu bạn sử dụng ZSH, bạn có thể làm một cái gì đó như bindkey -s '\e[12~' "sudo !!\n"liên kết (trong trường hợp này) F2 để chạy lệnh đó. Tôi có sự ràng buộc đó, vì vậy khi tôi chạy một cái gì đó và thấy thông báo lỗi "bạn quên 'sudo', đánh lừa", tôi chỉ có thể đâm vào F2 trong sự khó chịu
Michael Mrozek

Phím F2 kém ....)
Eimantas

Tôi sử dụng tất cả các thời gian. Tôi liên tục quên gõ sudo trước khi chỉnh sửa tập tin máy chủ của tôi. Nếu điều đó xảy ra tôi chỉ cần chạy sudo !!. +1
Brian Wigginton

10

Nếu một lệnh mất đầu vào stdin, bạn có thể đọc đầu vào từ một tệp với <filename. Điều này có thể xuất hiện bất cứ nơi nào trong lệnh, vì vậy những dòng này là tương đương:

cat filename
cat <filename
<filename cat

Điều này đặc biệt hữu ích cho grep, vì nó cho phép bạn đặt biểu thức ở cuối dòng, vì vậy bạn có thể nhanh chóng sửa đổi lệnh grep bằng cách nhấn Up, mà không cần phải cuộn sang trái để vượt qua tên tệp:

<filename grep 'expression'

3
Một mẹo hay! Đáng lưu ý rằng điều này không thực sự sắp xếp lại các đối số cho lệnh. Thay vào đó, nó đưa tập tin vào quá trình 'STDIN, vì grep hiện không có đối số tập tin, nó mặc định là đọc từ STDIN. Hiểu điều này sẽ mở ra nhiều cơ hội để sử dụng kỹ thuật này với các lệnh khác và cũng giúp mọi người hiểu những gì đang diễn ra khi mọi thứ không hoạt động như mong đợi. Để biết thêm thông tin, hãy tra cứu các đường ống và chuyển hướng: dsj.net/compedge/shellbasics1.html
chillitom

@chill Điểm tốt; tiền boa thực sự bị sai đến mức về cơ bản là sai. Tôi viết lại nó dựa trên nhận xét của bạn
Michael Mrozek

Một cái gì đó tôi phát hiện ra gần đây: bạn có thể chuyển hướng đầu vào thành các vòng lặp (for, while, v.v.). Xem faqs.org/docs/abs/HTML/redircb.html .
Lucas Jones

Thông thường bạn đặt chuyển hướng vào cuối. Mặc dù phép ẩn dụ đường ống có vẻ tốt hơn <input foo | bar | baz >output, nhưng nó không hoạt động nếu bạn thử trộn vào một số nguyên thủy vòng lặp vỏ như whilehoặc forở giữa. Vì vậy, tôi đã từ bỏ và chỉ đưa nó vào cuối theo quy ước.
jmtd

@jmtd Chà, đặt nó ở cuối sẽ loại bỏ "Điều này đặc biệt hữu ích cho grep, vì nó cho phép bạn đặt biểu thức ở cuối dòng, vì vậy bạn có thể nhanh chóng sửa đổi lệnh grep bằng cách nhấn Up mà không cần phải cuộn còn lại để vượt qua tên tệp "
Michael Mrozek

9

Bạn có thể sử dụng CDPATHđể thiết lập thư mục tương đương PATH; nếu bạn cố gắng cd foovà không có footrong thư mục hiện tại, shell sẽ kiểm tra từng thư mục CDPATHtìm kiếm footrong chúng và chuyển sang thư mục đầu tiên mà nó tìm thấy:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise

3
Điều này có thể gây ra vấn đề. Xem softpanorama.org/Scripting/Shellorama/cdpath.shtml "Nếu $ CDPATH được đặt, cd tích hợp sẽ không gắn thêm thư mục hiện tại vào nó. Điều này có nghĩa là cd sẽ thất bại nếu không có tên thư mục hợp lệ nào có thể được xây dựng từ bất kỳ của các mục trong $ CDPATH, ngay cả khi một thư mục có cùng tên với tên được đặt làm đối số cho cd tồn tại trong thư mục hiện tại. " Tôi đã bị cắn bởi điều này, một số Makefile đã ngừng hoạt động. Đang áp dụng. rõ ràng có thể giúp đỡ, nhưng cũng có một số vấn đề với điều đó.
ustun

9
vi `which scriptname`

Vì khi bạn không biết nơi nào đó sống và bạn cũng không quan tâm.


8
Tôi không có ý định tiếp tục cắm các tính năng ZSH, nhưng tôi cứ nghĩ về chúng khi người khác trả lời :). Trong ZSH, bạn có thể thực hiện = foo để gọi whichtự động, vì vậyvi =scriptname
Michael Mrozek

Nếu bạn gặp khó khăn khi tìm kiếm nhân vật backtick, bạn cũng có thể sử dụng$(scriptname)
Patrick

9

Dấu . Nó đặt lệnh của bạn trong nền, vì vậy bạn có thể tiếp tục gõ.

$> sudo updatedb &

Làm việc cùng, và sau một thời gian bạn thấy:

[1] 17403

Và quá trình của bạn đã xong! Tuyệt vời cho những thứ mà bạn không cần đợi chúng chấm dứt.


11
Và nếu ứng dụng của bạn là GUI, có lẽ bạn không muốn nó tiếp tục công việc. Nối &!đến nền công việc không thừa nhận nó từ vỏ!
unperson325680

@progo: Điều đó không làm việc cho tôi trong bash.
Nathan Osman

@George. Có vẻ như bạn đúng. Tôi đã học được rằng zsh hỗ trợ nó, và sau đó tôi nghe nói rằng bash cũng hỗ trợ nó. Ôi trời :(
unperson325680

1
@progo: Hóa ra việc chuẩn bị lệnh với nohupviệc thực hiện điều này.
Nathan Osman

8

Hoàn thành tab . Sẽ tệ đến mức nào nếu bạn phải loại tất cả các nhân vật của mọi con đường?


5
Có Linux tự sát. Nếu bạn gõ sai lệnh - nó sẽ làm rm -fr /. Vì vậy, yeah, hoàn thành Tab là rất quan trọng ...
Eimantas

Không tệ như bạn nghĩ (nhưng vẫn tệ), bạn chỉ cần rắc các ký tự đại diện ở khắp mọi nơi:ls /usr/lib/game-d*/rott*
jmtd

@Eimantas Không rm -rf /bị vô hiệu hóa trong hầu hết các hệ thống Linux?
Bernhard Heijstek

@phycker - Tôi đã đề cập đến Su sát Linux, không phải "tất cả".
Eimantas

7

Umount thiết bị được gắn cuối cùng:

mount /media/whatever
...
u!mo

!momở rộng đến lệnh cuối cùng bắt đầu bằng mo(ít nhất là trong bash). Đôi khi một người làm mvở giữa, vì vậy u!msẽ không làm việc thường xuyên.


Sử dụng Ctrl + Shift + 6 (Ctrl + ^) để mở rộng lệnh mà không cần chạy nó như một biện pháp phòng ngừa an toàn
ColinM

7

Tôi có cái này trong .bashrc của tôi

#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]"
}

Và khi tôi có mã nguồn html trong clipboard và muốn tìm tất cả các liên kết tôi sử dụng

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

Và tôi có tất cả các url trong clipboard

Tôi cũng có chức năng này

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

kích thước hiển thị (con người có thể đọc được) và tên tệp.

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

bí danh này là để hiển thị temerature

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

với hàm này tôi có thể tính sản phẩm hoặc tổng của các đối số.

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()))";
}

Đây là hàm hữu ích phân tách đầu vào tiêu chuẩn được phân tách bằng regex và sau đó tham gia kết quả.

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

chức năng giai thừa

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

Hàm này hiển thị văn bản wiki qua DNS

Tôi cũng có ba màu sắc

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]
}

Hàm này xác nhận tệp băm md5.

điều này sẽ hiển thị thông báo lỗi cho một mã nhất định

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

Bạn có thể in tất cả các tin nhắn với

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

6

Một mẹo ZSH hữu ích khác:

Xử lý đầu ra của lệnh dưới dạng tệp:

emacs =(hg cat -r 100 somefile)

Điều này mở ra một phiên bản cũ của tệp được theo dõi Mercurial trong emacs để xem được tô sáng theo cú pháp. Nếu không có điều đó, tôi sẽ phải mess xung quanh với hg revert, hg archivehoặc một cách rõ ràng gửi hg catđầu ra vào một tập tin tạm thời.

Tất nhiên, điều này hoạt động với bất kỳ chương trình nào mở tệp và bất kỳ chương trình nào in ra đầu ra tiêu chuẩn.


5
Bạn có thể làm điều này trong bash với <()
ScaryAardvark

5

Một tính năng ZSH cụ thể là bí danh suffix, thiết lập bằng cách đưa ra aliasnhững -slá cờ:

alias -s ext=program

Nếu một phần mở rộng nhất định có bí danh hậu tố, bạn có thể thực thi trực tiếp một tệp có phần mở rộng đó và ZSH sẽ khởi chạy chương trình đã cho và truyền tên tệp làm đối số. Vì vậy, nếu bí danh trên có hiệu lực, các dòng này là tương đương:

/path/to/foo.ext
program /path/to/foo.ext

Đây là một điều tôi thực sự nhớ về Windows ... cho đến khi tôi nhận ra rằng "chương trình" luôn là emacs, vì vậy tôi đã ngừng sử dụng shell để mở tệp và chỉ sử dụng Cx Cf (duh).
harpo

5

Một trong những tính năng ZSH yêu thích mọi thời đại của tôi được đặt tên là các thư mục. Bạn có thể xuất một biến có tên đã cho, với giá trị trỏ đến một đường dẫn nhất định:

export foo=/usr/bin

Bây giờ bạn có thể sử dụng ~footrong một lệnh để tham khảo /usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename

nếu lời nhắc của bạn hiển thị thư mục làm việc hiện tại, tên của các biến cũng sẽ được sử dụng ở đó theo như tôi nhớ.
Andre Holzner

4

Xem câu hỏi này .

Khi bạn chạy 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

dòng cuối cùng chứa grepmột chút gì đó anoying

Bạn có thể thoát khỏi điều này bằng cách chạy 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

cập nhật : hoặc chỉ chạypgrep string


vâng, rất hữu ích Bạn nên trích dẫn openbox mặc dù ( '[o]penbox'). Dấu ngoặc sẽ hoạt động như một loại hình cầu, vì vậy nếu có openbox trong thư mục của bạn (giả sử bạn đang ở /usr/bin), bash sẽ chỉ sử dụng openbox, điều này sẽ ngăn chặn thủ thuật grep.
Rich Homolka

4
  • Lệnh không làm gì :như trong

    while :; do :; done
  • Mở rộng niềng răng kết hợp với các vòng lặp:

    for c in {1..3}; do :; done
  • !toán tử và toán tử ngắn mạch ||&&

    [ -d /tmp/dir ] || mkdir /tmp/dir
    
    if ! ping 34.41.34.1; then :; fi
  • sử dụng shell phụ thay vì pop / đẩy (có ích trong các tập lệnh)

    ~$ ( cd /tmp; echo $PWD )
    /tmp
    ~$
  • loại lệnh là gìtype

    ~$ type type
    type is a shell builtin
    ~$ type ls
    ls is aliased to `ls --color=auto'
    ~$ f(){ :; }
    ~$ type f
    f is a function
    f () 
    { 
         :
    
    }
  • cũng rất hay: đây-chuỗi

    ~$ cat <<<"here $PWD"
    here /home/yourname
    ~$
  • và yêu thích của tôi: chuyển hướng trong danh sách các lệnh

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

3

Tôi thích nhét nhiều thứ nhất có thể vào PS1 của mình. Một số điều hữu ích cần nhớ:

\e[s\e[ulưu và bỏ vị trí con trỏ tương ứng. Tôi sử dụng điều này để tạo một 'thanh thông tin' ở đầu màn hình, một vài dòng dài, có thể phù hợp với nhiều thứ hơn. Thí dụ:

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\]\$ '

Kết hợp với alias clear='echo -e "\e[2J\n"'. Hãy thử nó!

Ngoài ra, PROMPT_COMMANDbiến xác định một lệnh để thực thi trước PS1 mỗi lần.

Một số khác là bglệnh. Nếu bạn quên đặt &ở cuối lệnh, chỉ cần nhấn ^Zvà gõ bg, và nó chạy trong nền.


cảm ơn vì bg, khi tôi có một chương trình đang chạy ẩn và vô tình nhấn fgtôi không biết làm thế nào để đẩy nó trở lại: D
phunehehe

Tôi thích sạch sẽ PS1vì vậy tôi đặt hầu hết những thứ tôi muốn vào dòng dưới màn hình của mình ...
Josh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.