cat writebug.cn/history

一个开发者的技术博客。

bash

Linux 下shell基本上默认是 bash, 下面是我总结的一些技巧。

bash 重定向

find /etc -name passwd  1> 1.txt # 把标准输出重定向到 1.txt,屏幕上只显示错误输出
find /etc -name passwd  2> 1.txt # 略
find /etc -name passwd  2>&1  > 1.txt # 标准错误标准输出,同时导出到一个文件
find /etc -name passwd  &>  1.txt # 标准错误标准输出,同时导出到一个文件  &代表all(0,1,2,3....),不建议使用

tr 'a-z' 'A-Z' <<< "hello"

tr 'a-z' 'A-Z' <<EOF
hello world
EOF

历史命令搜索

ctrl+r  
ctrl+r 搜索下一条

trap 可以捕获信号

目录跳转

pushd, popd, dirs 实现多目录跳转 pushd 命令用来更改您的当前目录并将其存储在堆栈中。 popd 命令用来从堆栈的顶部移除目录并使您返回该位置。 dirs 命令来显示当前目录堆栈。(dir –v –p) pushd +n; popd +n 可以操作虚拟目录堆栈  

快速跳至常用目录

你可能已经知道$PATH变量可以列出 bash的“搜索路径”——当在当前目录不能找到请求的文件时,bash会自动搜索的目录。不过,bash也支持$CDPATH变量,当试图改变目录时该变量列出cd命令转向的目录。为了使用这个特性,我们要对$CDPATH变量赋值一个目录列表,如下面的例子所示: bash> CDPATH='.:~:/usr/local/apache/htdocs:/disk1/backups' bash> export CDPATH 现在,无论何时使用cd命令,bash将会检查$CDPATH列表中的所有目录来查找要转向的目录名。  

特殊参数

1. $*: 代表所有参数其间隔为IFS内定参数的第一个字元 
2. $@: *星号类同不同之处在於不参照IFS 
3. $#: 代表参数数量 
4. $?: 执行上一个指令的返回值 
5. $-: 最近执行的foreground pipeline的选项参数 
6. $$: 本身的Process ID 
7. $!: 执行上一个背景指令的PID 
8. $_: 显示出最後一个执行的命令

bash快捷键

  • Emacs风格
  • ctrl+p: 方向键 上 ↑ 
  • ctrl+n: 方向键下 ↓ 
  • ctrl+b: 方向键 ← 
  • alt+f: 光标右移一个单词 
  • ctrl+f :方向键 → 
  • alt+b: 光标左移一个单词 
  • ctrl+a:光标移到行首 
  • ctrl+e:光标移到行尾 
  • ctrl+k:清除光标后至行尾的内容。 
  • ctrl+d: 删除光标所在字母;注意和backspace以及ctrl+h的区别,这2个是删除光标前的字符 
  • ctrl+r:搜索之前打过的命令。会有一个提示,根据你输入的关键字进行搜索bash的history 
  • ctrl+m : 输入回车 
  • ctrl+i : 输入tab 
  • ctrl+[ : 输入esc
  • 其它 
  • ctrl+h:删除光标前一个字符,同 backspace 键相同。 
  • alt + p 非增量方式反向搜索历史 
  • alt + > 历史命令列表中的最后一行命令开始向前 
  • ctrl+u: 清除光标前至行首间的所有内容。 
  • ctrl+w: 移除光标前的一个单词 
  • ctrl+t: 交换光标位置前的两个字符 
  • ctrl+y: 粘贴或者恢复上次的删除 
  • ctrl+l:清屏,相当于clear。 
  • ctrl + xx 光标在行头与行尾进行跳转 
  • alt+r 撤销当前行的所有内容 
  • ctrl+z : 把当前进程转到后台运行 
  • ctrl+s : 锁住屏幕 
  • ctrl+q : 恢复屏幕 
  • ctrl+v key: 输入特殊字符 
  • alt + l 将当前光标处之后的字母转化成小写字母 
  • alt + u 将当前光标处之后的字母转化成大写字母 
  • ctrl + Alt + e 扩展命令行的内容(例如:ls  =>  ls  -l  --color=tty) 
  • ctrl+c:杀死当前进程, 输入模式下,中断输入的命令。 
  • ctrl+d:退出当前 Shell 
  • esc + . 快捷键可以轮询历史命令的参数或选项。 
  • esc + t 快捷键可以 置换前两个单词。 
  • 输入重复字母 Esc {100} e 可以输入100个e字符
  • 按多次{esc}可以补全 
  • {esc}{~}可以补全本机上的用户名 
  • {esc}{/}可以补全文件名 
  • {esc}{@}可以补全主机名,localhost可以方便地用 lo补全.  

Bang Bang 历史命令

!!    重新执行上一条命令 
!N  重新执行第N条命令。比如 !3 
!-N 重新执行倒数第N条命令。!-3 
!string  重新执行以字符串打头的命令。 比如 !vim 
!?string?  重新执行包含字符串的命令。 比如 !?test.cpp? 
!?string?%  替换为: 最近包含这个字符串的命令的参数。比如:   vim !?test.cpp?% 
!$   替换为:上一条命令的最后一个参数。比如 vim !$ 
!!string  在上一条命令的后面追加 string ,并执行。 
!Nstring  在第N条指令后面追加string,并执行。 
^old^new^  对上一条指令进行替换 
修饰
:s/old/new/  对第N条指令中第一次出现的new替换为old 比如 vim !?test.cpp?:s/cpp/c/ 
:gs/old/new/  全部替换 
:wn  w为数字 取指令的第w个参数. 
:p 回显命令而不是执行, 比如 !ls:p   这个很有用, 你可以先查看你选的命令对不对,要执行时再使用!!

Bash相关文件

     /etc/profile 设置环境变量(所有用户) 
     ~/.bash_profile 设置环境变量(当前用户) 
     ~/.bashrc 
     ~/.bash_history 
     ~/.bash_logout

login shell 和 no-login shell

“login shell” 代表用户登入, 比如使用 “su -“ 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式.

该模式下的 shell 会去自动执行 /etc/profile 和 ~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般再 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件.

而 no-login shell 的情况是我们在终端下直接输入 bash 或者 bash -c “CMD” 来启动的 shell. 该模式下是不会自动去运行任何的 profile 文件.

bashrc 和 profile 的区别

profile

其实看名字就能了解大概了, profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.

bashrc

bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.


!76                 没有空格,运行history中76号指令
^2^1  把上个指令中的2改为1,并执行
eg:     ^196^1

~   家目录
~user1     user1的家目录
-   上一个目录

touch {a,b}   建立  a  b两个文件
touch a{a,b}
将建立 aa ab两个文件
touch  {a,b}.{1,2}     {}作用:排列组合
将建立四个文件

使用指令运行结果作为输入  ``
可以用在""中,优先级比""
`command`和$(command)一样

设置环境变量   
export a=3
echo  $a

用指令做数学运算
echo  $[$a+5]
let "a=$b+1"

用法:
$[表达式]   (表达式中的空格不影响结果)
建议表达式中变量和运算符用空格隔开,并前后各保留一个空格(标准语法)
eg:   echo   $[ $a + $b ]
除法结果只保留整数
**表示次方 (幂运算)

\反斜线   叫跳脱字元(符)
可以把后面的字符按原本的样子呈现出来
eg :
echo  your cost is $5.00
结果显示
your cost is .00
echo  your cost is \$5.00
显示正常
如果指令最后一行是\,表示下一行继续输入这个指令,(直接去掉换行符)

单双引号的使用
echo  *        显示目录里有那些文件
echo  \*      显示  *
echo  "*"     显示  *
echo  '*'     显示  *

单引号可以禁止所有特殊字符的功能
双引号可以禁止大多数特殊字符的功能,除了以下四个
$ \  ` ! 
 
echo  !3
显示 ls -l
!3被解释为历史输入中的第3个

ctrl+r   搜索历史输入的指令

将上个指令的最后一个参数补进来
用  按esc,松开,再按.   (dot)
或 按alt+.   

bash的指令编辑模式
预设是emacs-style模式
切换到vi-style模式 
set  -o  vi
set  -o  查看目前设定
 这里的 -  是disable的意思
o是off的意思
停用vi编辑模式   set +o vi
切换到emacs模式  set  -o  emacs

gnome-终端 快捷键
ctrl+shift+t 打开新标签
ctrl+pg up切换到写一个标签
ctrl+ pg dn切换到上一个标签
alt+N         N是数字,指定要切换到哪个标签
ctrl+shift+w  关闭当前标签

readline库的键绑定

在bash里面键绑定有两种方式, 1是通过readline库的~/.inputrc文件实现。2是通过bash的内建命令bind实现。 bind 可以绑定a. bash命令 b. readline命令 c. 宏 (意思是在当前行中插入字符串) bind 用法:

查询键绑定:
bind -l 列出所有readline函数
bind -p 列出所有readline函数 以及对应的键绑定
bind -s 显示绑定的键序列和对应的宏
bind -q function 查询那些键将执行function

设置键绑定:
bind '"keyseq": command' 绑定一个readline功能
bind '"keyseq":"keystrokes"' 绑定readline宏 (自动输入按键序列)
bind -x '"keyseq": shell-command' 绑定shell命令 
bind -r keyseq 取消当前任何 keyseq 的关联


常见快捷键转义序列:
\C-    Ctrl 前缀
\M-    Meta 前缀
\e     一个 Esc 字符
keyseq是快捷键对应的转义序列, 支持多个快捷键和普通按键。可以使用 Ctrl-v 来查看快捷键对应的转义序列

一个例子:
bind '"\C-x\C-r": re-read-init-file' # 先按ctrl+x, 在按ctrl+r
bind bind '"^Xb": backward-kill-word' # 先按ctrl+x,在按b