cmc*_*nty 93 command-line shell
分享您的 Unix/Linux 命令行功能和技巧。如果可能的话,尽量保持它的外壳/发行版不可知。有兴趣查看别名、单行、键盘快捷键、小 shell 脚本等。
Mic*_*zek 88
这!!在此答案中提到的技巧上有所扩展。实际上有一堆与历史相关的命令往往会被遗忘(人们倾向于刺Up100 次而不是寻找他们知道他们输入的命令)。
history命令将显示最近运行的命令列表,左侧有一个事件指示符!N 将替换与事件指示符关联的命令 N!-N将替代N 日最近的命令; 例如!-1将替换最近的命令,!-2第二个最近的命令,等等。!!是 , 的简写!-1,以快速替换最后一个命令!string 将替换以开头的最新命令 string!?string? 将替换包含的最新命令 string可以将字指示符添加到!历史命令以修改结果。冒号分隔事件和单词指示符,例如!!:0。事件指示符在使用单词指示符时!!可以缩写为 just !,因此!!:0等效于!:0。
!:0 将得到执行的命令!:1将获得第一个参数(以及!:2第二个参数等)!:2-3 将获得第二个和第三个参数!:^是获得第一个参数的另一种方法。!:$将得到最后!:*将获得所有参数(但不是命令)修饰符也可以附加到!历史命令,每个修饰符都以冒号为前缀。任何数字都可以堆叠(例如!:t:r:p)。
h -- 与基本文件名对齐t -- 只有基本文件名r -- 与文件扩展名对齐e -- 只有文件扩展名s/search/replacement-替换第一次出现search与replacementgs/search/replacement-更换所有出现的search与replacementchi*_*tom 64
bash -- 插入前一行的最后一个参数
alt-. 有史以来最有用的组合键,试试看,不知为何没人知道这个组合。
一次又一次地按下它以选择较旧的最后参数。
当您想对刚才使用的参数/文件做更多事情时,这很棒。
小智 49
我最喜欢的是
man 7 ascii
Run Code Online (Sandbox Code Playgroud)
简单而且非常有用。
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
Run Code Online (Sandbox Code Playgroud)
看看这个网站commandlinefu.com。
您还可以在 Peteris Krumins 的博客上查看这四篇文章
Mic*_*zek 42
不确定这是否算作“技巧”,但人们似乎非常不知道标准的 readline 热键。在 shell 中的特殊用途:
小智 36
CTRL+R在 BASH 中搜索/激活以前执行的命令(~/.bash_history 的内容)。
这通常非常有帮助。运行此别名将在端口 8000 上通过 HTTP(索引)为 PWD 提供服务:
alias webserver="python -m SimpleHTTPServer"
Run Code Online (Sandbox Code Playgroud)
而且因为我一直在运行 make 并且打字太快,这些别名可能是我最常用的(认真的):
alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make
Run Code Online (Sandbox Code Playgroud)
可能我最常用的 BASH 是一个我称之为上传的简单脚本。我使用它将任何类型的内容 blit 到我的 Linode,并将生成的 HTTP URL 复制到我的剪贴板(单击中键)。对于在 IRC 中向人们粘贴内容非常有用:
scp -r $* $user@$host:public_html && {
URL="http://$host/~$user/$(basename $1)"
echo "$URL"
xselection -replace PRIMARY "$URL"
}
Run Code Online (Sandbox Code Playgroud)
只是一对。我可以稍后发布更多,必须回去工作!
Ale*_*x B 31
diff 两个命令的输出,无需手动创建临时文件(bash):
diff <(ls dir1) <(ls dir2)
Run Code Online (Sandbox Code Playgroud)
小智 29
这通常在我的启动脚本中(.bashrc、.profile 等)
shopt 天哪,看看评论:
shopt -s cdspell # try to correct typos in path
shopt -s dotglob # include dotfiles in path expansion
shopt -s hostcomplete # try to autocomplete hostnames
Run Code Online (Sandbox Code Playgroud)
保存击键的别名:
mkdir并cd放入其中:
mkcd () { mkdir -p "$@" && cd "$@"; }
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的一点,我已经放弃记住 tar 语法,所以:
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
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*fan 29
支撑扩展:
大括号扩展是一种可以生成任意字符串的机制。
它允许您替换繁琐的行,例如:
mv loong/and/complex/file/name loong/and/complex/file/name.bacukup
Run Code Online (Sandbox Code Playgroud)
使用较短的实例
mv loong/and/complex/file/name{,backup}
Run Code Online (Sandbox Code Playgroud)
其他一些用途
# 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
Run Code Online (Sandbox Code Playgroud)
算术扩展:
算术扩展允许对算术表达式求值并替换结果。算术展开的格式为:
Run Code Online (Sandbox Code Playgroud)$((expression))该表达式被视为在双引号内,但括号内的双引号不会被特殊处理。表达式中的所有标记都经过参数扩展、字符串扩展、命令替换和引号删除。算术扩展可以嵌套。
$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
Run Code Online (Sandbox Code Playgroud)
小智 21
两个 bash 函数,它为我节省了很多击键。
每次成功 cd 后自动执行 ls:
function cd {
builtin cd "$@" && ls
}
Run Code Online (Sandbox Code Playgroud)
上n级:
# Usage .. [n]
function .. (){
local arg=${1:-1};
local dir=""
while [ $arg -gt 0 ]; do
dir="../$dir"
arg=$(($arg - 1));
done
cd $dir #>&/dev/null
}
Run Code Online (Sandbox Code Playgroud)
men*_*ant 17
由于我通常在想要搜索之前进入命令行的一半(bash 中的 CTRL-R),因此我的 .bashrc 中有以下内容
bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward
Run Code Online (Sandbox Code Playgroud)
这意味着,如果我输入 cd 然后按上/下,我可以看到我有 cd 的所有选项。基本上我将它用于经常使用的目录。就像“cd w”一样,我最终要浏览我经常使用的所有工作区。
jac*_*onh 17
为我节省大量时间的一件事是 pushd/popd 命令。这些家伙让你创建一堆目录并减少大量输入:
/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make
Run Code Online (Sandbox Code Playgroud)
use*_*394 14
该screen 命令。它基本上保存了您回来时的命令行会话。它有点像一个终端管理器,就像一个窗口管理器。这样,在单个终端会话中,您可以同时运行多个虚拟终端。这很酷。
如果使用screen,这个 shell 函数(放入.bashrc)非常有用:
function scr {
if screen -ls | grep -q Main; then
# reattach to Main:
screen -xr Main
else
# name session "Main":
screen -S Main
fi
}
Run Code Online (Sandbox Code Playgroud)
输入后scr,它会检查您的主会话是否存在并将附加到它。否则它会创建它。
小智 13
如果你需要在 bash 中编辑一个特别长的命令行
^X^E (Ctrl-X Ctrl-E)
Run Code Online (Sandbox Code Playgroud)
将在编辑器 ($EDITOR) 中打开它。
在 zsh 中,您可以通过将其添加到 .zshrc 来获得相同的行为:
autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line
Run Code Online (Sandbox Code Playgroud)
mig*_*aza 12
如果你是一个快速打字员,这些会派上用场:
alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'
Run Code Online (Sandbox Code Playgroud)
此宏可帮助您计算一列输出的总数:文件大小、字节、数据包,您所要做的就是指定要添加的列:
total ()
{
if [ x$1 = x ]; then set `echo 1`; fi
awk "{total += \$$1} END {print total}"
}
Run Code Online (Sandbox Code Playgroud)
例如,您可以像这样使用它,不带参数,它将第一列的总数相加:
du | total
Run Code Online (Sandbox Code Playgroud)
如果您提供参数,它将对该列求和,例如,这将为您提供 /tmp 中所有 C# 文件使用的总字节数:
ls -l /tmp/*cs | total 5
Run Code Online (Sandbox Code Playgroud)
有时你的控制台会因为你不小心查看了一个二进制文件(例如 cat /bin/ls)而搞砸了,你可以用这个 shell 函数来恢复终端:
restaura ()
{
perl -e 'print "\e)B";'
}
Run Code Online (Sandbox Code Playgroud)
我喜欢我的 ls 使用字符来区分文件的类别,并且还隐藏了我的编辑器生成的备份文件(备份文件以 ~ 字符结尾):
alias ls='ls -FB'
Run Code Online (Sandbox Code Playgroud)
Eim*_*tas 11
alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.
Run Code Online (Sandbox Code Playgroud)
当我忘记时,我的最爱之一s:
$ s !! # last command with super user priviledges
Run Code Online (Sandbox Code Playgroud)
Mic*_*zek 10
如果命令接受 stdin 输入,则可以从带有<filename. 这可以出现在命令的任何地方,所以这些行是等效的:
cat filename
cat <filename
<filename cat
Run Code Online (Sandbox Code Playgroud)
这对 grep 尤其有用,因为它允许您将表达式放在行尾,因此您可以通过点击 快速修改 grep 命令Up,而无需向左滚动以跳过文件名:
<filename grep 'expression'
Run Code Online (Sandbox Code Playgroud)
您可以使用CDPATH来设置相当于PATH;的目录。如果您尝试cd foo并且foo当前目录中没有,shell 将检查每个目录CDPATH以foo在其中查找,并切换到它找到的第一个目录:
export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
Run Code Online (Sandbox Code Playgroud)
vi `which scriptname`
Run Code Online (Sandbox Code Playgroud)
因为当你不知道某物住在哪里时,你也不在乎。
该符号。它会将您的命令置于后台,因此您可以继续输入。
$> sudo updatedb &
Run Code Online (Sandbox Code Playgroud)
一起工作,过了一会儿你会看到:
[1] 17403
Run Code Online (Sandbox Code Playgroud)
你的过程就完成了!非常适合您不需要等待它们终止的事情。
选项卡完成。如果您必须输入每条路径的所有字符,这有多糟糕?
小智 7
卸载上次安装的设备:
mount /media/whatever
...
u!mo
Run Code Online (Sandbox Code Playgroud)
!mo扩展到以mo(至少在 bash 中)开头的最后一个命令。有时一个mv在中间,所以u!m不会经常工作。
我的 .bashrc 中有这个
#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'
Run Code Online (Sandbox Code Playgroud)
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]"
}
Run Code Online (Sandbox Code Playgroud)
当我在剪贴板中有 html 源代码并想找到我使用的所有链接时
c-v | find-all 'href="([^"]*)"' | c-c
Run Code Online (Sandbox Code Playgroud)
我在剪贴板中有所有网址
我也有这个功能
function lsq(){
ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}
Run Code Online (Sandbox Code Playgroud)
显示大小(人类可读)和文件名。
alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'
Run Code Online (Sandbox Code Playgroud)
此别名用于显示温度
function separate() {
python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}
Run Code Online (Sandbox Code Playgroud)
使用此函数,我可以计算参数的乘积或总和。
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()))";
}
Run Code Online (Sandbox Code Playgroud)
这是一个有用的函数,它拆分由正则表达式分隔的标准输入,然后连接结果。
function factorial() {
seq -s* $1 | bc
}
Run Code Online (Sandbox Code Playgroud)
阶乘函数
function wiki() { dig +short txt $1.wp.dg.cx; }
Run Code Online (Sandbox Code Playgroud)
此功能通过 DNS 显示 wiki 文本
我也有三色功能
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";
}
Run Code Online (Sandbox Code Playgroud)
function md5check() {
test `md5sum $2 | cut -d' ' -f1` = "$1" && green [OK] || red [FAIL]
}
Run Code Online (Sandbox Code Playgroud)
此函数验证文件 md5 哈希。
这将显示给定代码的错误消息
function strerror() { python -c "import os; print os.strerror($1)"; }
Run Code Online (Sandbox Code Playgroud)
您可以打印所有消息
alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
Run Code Online (Sandbox Code Playgroud)
另一个有用的 ZSH 技巧:
将命令的输出视为文件:
emacs =(hg cat -r 100 somefile)
Run Code Online (Sandbox Code Playgroud)
这会在 emacs 中打开一个旧版本的 Mercurial 跟踪文件,以进行语法突出显示。不这样做,我会更动hg revert,hg archive或明确地发送hg cat输出到一个临时文件。
当然,这适用于任何打开文件的程序,以及任何打印到标准输出的程序。
ZSH 特有的特性是后缀别名,通过提供alias以下-s标志来设置:
alias -s ext=program
Run Code Online (Sandbox Code Playgroud)
如果给定的扩展名有后缀别名,你可以直接执行带有该扩展名的文件,ZSH 将启动给定的程序并将文件名作为参数传递。因此,如果上述别名有效,则这些行是等效的:
/path/to/foo.ext
program /path/to/foo.ext
Run Code Online (Sandbox Code Playgroud)
我最喜欢的 ZSH 功能之一是命名目录。您可以导出具有给定名称的变量,其值指向某个路径:
export foo=/usr/bin
Run Code Online (Sandbox Code Playgroud)
现在您可以~foo在命令中使用来引用/usr/bin:
cd ~foo
~foo/ls
cat ~foo/filename
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49603 次 |
| 最近记录: |