Câu trả lời:
Đ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õ).
history
lệ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
!-N
sẽ thay thế các N
thứ lệnh gần nhất; ví dụ: !-1
sẽ thay thế lệnh gần đây nhất, lệnh gần đây !-2
thứ hai, v.v.!!
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 đó !!:0
tương đương với !:0
.
!:0
sẽ nhận được lệnh đã được thực thi!:1
sẽ nhận được đối số đầu tiên (và !:2
thứ 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ệpe
- Chỉ phần mở rộng tên tệps/search/replacement
- Thay thế lần xuất hiện đầu tiên search
bằngreplacement
gs/search/replacement
- Thay thế tất cả các lần xuất hiện search
bằngreplacement
!-#
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
!N
sẽ chạy lệnh ..." là một mô tả quá hẹp; thực tế, !N
sẽ đượ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 !!
.
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 eshell
trong Emacs). Vì vậy, tôi thường làm phiền họ.
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.
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.
yank-last-arg
lệ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.
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
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ẻ.
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+L
tươ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.
Ctrl+W
để cắt ngược một từ, Alt+F
chuyển tiếp một từ, Alt+B
chuyển ngược một từ trong một dòng. Tôi thích Ctrl+Y
và Shift+Insert
bở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
).
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!
alias mk=make
Nhanh 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 ...
alias m=make
, hoặc thậm chí m=make -j6
hoặc tương tự - ngoại trừ tôi đã sử dụng alias m=mutt
☺
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 -
cd..
từ DOS đã ăn sâu vào trí nhớ cơ bắp của tôi ...
cd
(không có đối số) sẽ đưa bạn đến thư mục chính của bạn.
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
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 đó
Đ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:
mkdir
và cd
và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
}
mkcd
chỉ 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" }
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
}
builtin foo
để có được một chức năng được xác định cd
; Tôi đã sử dụng chdir
chức năng của mình. Tiện dụng
cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
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.
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
u
và o
đứng cho ở đây?
setopt autopushd
và tất cả các thay đổi thư mục sẽ tự động đẩy
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ó.
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
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'
s/fast/sloppy/
reset
nơi bạn sử dụng restaura
.
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
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
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'
<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ư while
hoặc for
ở giữa. Vì vậy, tôi đã từ bỏ và chỉ đưa nó vào cuối theo quy ước.
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 foo
và không có foo
trong thư mục hiện tại, shell sẽ kiểm tra từng thư mục CDPATH
tìm kiếm foo
trong 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
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.
which
tự động, vì vậyvi =scriptname
$(scriptname)
Dấu và . 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.
&!
đến nền công việc và không thừa nhận nó từ vỏ!
bash
.
nohup
việc thực hiện điều này.
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?
rm -fr /
. Vì vậy, yeah, hoàn thành Tab là rất quan trọng ...
ls /usr/lib/game-d*/rott*
rm -rf /
bị vô hiệu hóa trong hầu hết các hệ thống Linux?
Umount thiết bị được gắn cuối cùng:
mount /media/whatever
...
u!mo
!mo
mở 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!m
sẽ không làm việc thường xuyên.
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'
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 archive
hoặ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.
Một tính năng ZSH cụ thể là bí danh suffix, thiết lập bằng cách đưa ra alias
những -s
lá 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
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 ~foo
trong một lệnh để tham khảo /usr/bin
:
cd ~foo
~foo/ls
cat ~foo/filename
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 grep
mộ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
'[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.
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 ||
và&&
[ -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
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
và \e[u
lư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_COMMAND
biến xác định một lệnh để thực thi trước PS1 mỗi lần.
Một số khác là bg
lệ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.
bg
, khi tôi có một chương trình đang chạy ẩn và vô tình nhấn fg
tôi không biết làm thế nào để đẩy nó trở lại: D
PS1
vì 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 ...