你的shell使用一种叫做signal(信号)的UNIX通信机制和进程进行通信。当一个进程接收到一个singal的时候,它会停止运行,处理这个信号,并且基于这个信号的信息改变运行流。所以,信号是一种软件中断。在我们的例子当中,当我们输入Ctrl-C时,shell会发送一个SIGINT信号给进程。
这里有一个使用Python来捕获SIGINT信号并且忽视它的例子,因为捕获了信号,所以不会导致程序停止。想要停止程序需要使用SIGQUIT,输入Ctrl-\即可。
#!/usr/bin/env python
import signal, time
def handler(signum, time):
print("\nI got a SIGINT, but I am not stopping")
signal.signal(signal.SIGINT, handler)
i = 0
while True:
time.sleep(.1)
print("\r{}".format(i), end="")
i += 1
我们输入了两次SIGINT信号,接着又输入了一个SIGQUIT信号。注意,Ctrl在终端中会被展示成^。
注意,在等号左右没有空格,因为alias是一个shell命令,它只接收一个参数。
别名有许多很方便的特性:
# 创建常用命令的缩写
alias ll="ls -lh"
# 能够少输入很多
alias gs="git status"
alias gc="git commit"
alias v="vim"
# 手误打错命令也没关系
alias sl=ls
# 重新定义一些命令行的默认行为
alias mv="mv -i" # -i prompts before overwrite
alias mkdir="mkdir -p" # -p make parent dirs as needed
alias df="df -h" # -h prints human readable format
# 别名可以组合使用
alias la="ls -A"
alias lla="la -l"
# 在忽略某个别名
\ls
# 或者禁用别名
unalias la
# 获取别名的定义
alias ll
# 会打印 ll='ls -lh'
注意别名默认不是在shell中永久保存的,为了让别名永久生效,你可以将配置写入shell的启动配置当中。比如.bashrc或.zshrc,下一节我们将会讲到这个部分。 配置文件(Dotfiles)
配置文件的一个痛点是它不能在不同的机器上生效,比如使用不同的操作系统或者是不同的设备,那么配置文件可能不能生效。有的时候你可能也会希望配置文件只在某些机器上生效。
有一些技巧可以轻松达到这个目的,如果机器适配配置文件,可以使用if判断语句来对使用配置的机器进行配置。比如:
if [[ "$(uname)" == "Linux" ]]; then {do_something}; fi
# 使用和 shell 相关的配置时先检查当前 shell 类型
if [[ "$SHELL" == "zsh" ]]; then {do_something}; fi
# 您也可以针对特定的设备进行配置
if [[ "$(hostname)" == "myServer" ]]; then {do_something}; fi
如果配置文件支持include功能,你也可以使用include,比如~/.gitignore可以这样编写:
[include]
path = ~/.gitconfig_local
对于每台机器来说,~/.gitconfig_local可以包含独有的一些配置。你甚至可以创建一个专门的仓库来追踪管理这些特定的配置。
在你想要不同的程序共享一些配置的时候,这个思路也一样有用。比如,你想要让bash和zsh共享同样的别名,你可以将这些别名写在.aliases当中,然后在这两个shell的配置当中加上:
# Test if ~/.aliases exists and source it
if [ -f ~/.aliases ]; then
source ~/.aliases
fi 远端机器
我们已经介绍了许多参数,一个很好的做法是为它们创建别名,比如这样:
alias my_server="ssh -i ~/.id_ed25519 --port 2222 -L 9999:localhost:8888 foobar@remote_server
不过更好的做法是配置~/.ssh/config
Host vm
User foobar
HostName 172.16.174.141
Port 2222
IdentityFile ~/.ssh/id_ed25519
LocalForward 9999 localhost:8888
# Configs can also take wildcards
Host *.mit.edu
User foobaz
配置~/.ssh/config一个额外的好处是这些别名其他的程序,比如scp、rsync、mosh都能够使用。
注意~/.ssh/config也是一个dotfile,一般情况下也可以被当做dotfile一起导入。如果你公开到互联网上,那么其他人也能看到你的一些潜在信息,比如服务器、用户名、端口号等等,这可能会帮助到那些想要入侵你的黑客,请务必小心。
服务器端的配置通常在/etc/ssh/sshd_config当中,你可以在其中配置诸如取消密码验证、修改ssh端口、开启X11转发等等。你可以针对每一个用户进行单独设置。 杂项
我们刚才已经看到,我们可以使用ps aux | grep命令来获得我们任务的pid来kill它们。但还有更好的做法。在终端开启一个sleep 10000的任务,使用Ctrl-Z让它进入后台,使用bg让它继续运行。现在使用pgrep命令来找到它的pid,使用pkill来杀掉它,而不再需要输入pid(提示:使用-af标记)