最新要闻
- 全球焦点!弯道超车成功!中国新能源汽车产销量全世界第一
- 每日关注!“准点下班被辞”女子申请赔偿一个月工资 公司回应:等仲裁结果
- 环球热资讯!《进击的巨人》最终季完结篇开播 前篇拿下豆瓣9.7分:改编超越原作
- 核心部件100%国产!东风新一代商乘通用氢燃料电池产品完成
- 世界热文:同档网络无敌!一加Ace 2V搭载自研的游戏云专网技术
- 代表建议试行十二年义务教育:中考定终身太早 拒绝小学初中内卷
- 一男子和峨眉山猴子练搏击互殴 当事人回应:条件反射、请勿模仿
- 精选! 《狂飙》“大嫂”高叶上手小米13:徕卡人像实拍样张美呆
- 天天时讯:3端通用!腾讯视频VIP会员年卡148元到手
- 当前快讯:董明珠称格力不看文凭只看能力:研究生到一线生产线非人才
- 济南动物园网红小黑猩猩“柒仔”去世:初步研判系突发疾病死亡
- 每日热议!奔驰4S店展车充新车 女子上门维权:被骗了、将走法律程序
- 天天快资讯丨突发!蔚来前实习生称遭同事强奸未遂 反被拒绝留用!公司:已成立调查组
- “清籁”琴
- 灭蟑螂小窍门厨房_灭蟑螂小窍门
- 【新要闻】如何去除新家的甲醛_如何去除新家的甲醛
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
The Missing Semester - 第五讲 学习笔记
第五讲 命令行环境
课程视频地址:https://www.bilibili.com/video/BV1Dy4y1a7BW
课程讲义地址:https://missing-semester-cn.github.io/2020/command-line/
本机学习使用平台:wsl1 + ubuntu20.04
(资料图片)
任务控制
我们来看如何结束进程、暂停进程和切换进程。
you can see the difference-between-job-task-and-process here.
最简单的方法——快捷键
:发送SIGINT
信号,中断进程;
:发送SIGTSTP
信号,暂停进程;
:发送SIGQUIT
信号,退出进程;(和SIGINT差不多)
优雅的方法——kill命令
SIGKILL
是一个特殊的信号,它不能被进程捕获并且它会马上结束该进程。不过这样做会有一些副作用,例如留下孤儿进程。
SIGTERM
则是一个更加通用的、也更加优雅地退出信号。
为了发出这个信号我们需要使用 kill
命令, 它的语法是: kill -TERM
。
关于kill
的信号选择我们可以通过kill -l
来查看。
PID的获取
用
jobs -l
来查看job的详细信息(包括PID)用
pgrep
来直接获取进程的PID。
后台进程
用
jobs
指令查看进程。jobs
命令会列出当前终端会话中尚未完成的全部任务,可以使用百分号 + 任务编号(jobs
会打印任务编号)来选取该任务。如果要选择最近的一个任务,可以使用$!
这一特殊参数。命令中的
&
后缀可以让命令在直接在后台运行,不过它此时还是会使用 shell 的标准输出,这种情况可以使用 shell 重定向处理。使用
fg
或bg
命令恢复暂停的工作。它们分别表示在前台继续或在后台继续。- 用
fg
指令使最近转进后台的 job 转回前台,用fg %{{job ID}}
来将特定的 job 转回前台执行。 - 用
bg
指令使最近暂停的 job 转回后台,用bg %{{job ID}}
来将特定的 job 转回后台执行。
- 用
让已经在运行的进程转到后台运行,您可以键入
Ctrl-Z
,然后紧接着再输入bg
。
注意,后台的进程仍然是您的终端进程的子进程,一旦您关闭终端(会发送另外一个信号
SIGHUP
),这些后台的进程也会终止。为了防止这种情况发生,您可以使用nohup
(一个用来忽略SIGHUP
的封装) 来运行程序。针对已经运行的程序,可以使用disown
。
演示例子
$ sleep 1000# output: ^Z# output: [1] + 18653 suspended sleep 1000$ nohup sleep 2000 output: [2] 18745appending output to nohup.out$ jobs# output: [1] + suspended sleep 1000# output: [2] - running nohup sleep 2000$ bg %1# output: [1] - 18653 continued sleep 1000$ jobs# output: [1] - running sleep 1000# output: [2] + running nohup sleep 2000$ kill -STOP %1# output: [1] + 18653 suspended (signal) sleep 1000$ jobs# output: [1] + suspended (signal) sleep 1000# output: [2] - running nohup sleep 2000$ kill -SIGHUP %1# output: [1] + 18653 hangup sleep 1000$ jobs# output: [2] + running nohup sleep 2000$ kill -SIGHUP %2$ jobs# output: [2] + running nohup sleep 2000$ kill %2# output: [2] + 18745 terminated nohup sleep 2000$ jobs
终端多路复用 TMUX
会话 Session
每个会话都是一个独立的工作区,其中包含一个或多个窗口。
tmux
开始一个新的会话;tmux new -s NAME
以指定名称开始一个新的会话;tmux ls
列出当前所有会话;- 在
tmux
中输入
,将当前会话分离;d
- 在
tmux a
重新连接最后一个会话。您也可以通过-t
来指定具体的会话;tmux kill-session -t
关闭指定会话 ;
窗口 Window
相当于编辑器或是浏览器中的标签页,从视觉上将一个会话分割为多个部分。
创建一个新的窗口,使用c
关闭;
跳转到第 N个窗口,注意每个窗口都是有编号的;N
切换到前一个窗口;p
切换到下一个窗口;n
重命名当前窗口;,
列出当前所有窗口;w
面板 Pane
像 vim 中的分屏一样,面板使我们可以在一个屏幕里显示多个 shell。
水平分割;"
垂直分割;%
切换到指定方向的面板,<方向> 指的是键盘上的方向键;<方向> - 可以在tmux里面的命令模式(按
打开),输入: set -g mouse on
,就可以启用鼠标点击和滚轮了;
- 可以在tmux里面的命令模式(按
切换当前面板的缩放;z
在不同的面板排布间切换;<空格>
开始往回卷动屏幕。您可以按下空格键来开始选择,回车键复制选中的部分(按q退出);[
关闭当前的面板/窗口;x
别名 Alias
shell 的别名相当于一个长命令的缩写,shell 会自动将其替换成原本的命令。例如,bash 中的别名语法如下:
alias alias_name="command_to_alias arg1 arg2"
注意, =
两边是没有空格的,因为 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 overwritealias mkdir="mkdir -p" # -p make parent dirs as neededalias 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)
很多程序的配置都是通过纯文本格式的被称作点文件的配置文件来完成的(之所以称为点文件,是因为它们的文件名以 .
开头,例如 ~/.vimrc
。也正因为此,它们默认是隐藏文件,ls
并不会显示它们)。
shell 的配置也是通过这类文件完成的。在启动时,您的 shell 程序会读取很多文件以加载其配置项。根据 shell 本身的不同,您从登录开始还是以交互的方式完成这一过程可能会有很大的不同。关于这一话题,这里 有非常好的资源。
对于 bash
来说,在大多数系统下,您可以通过编辑 .bashrc
或 .bash_profile
来进行配置。在文件中您可以添加需要在启动时执行的命令,例如上文我们讲到过的别名,或者是您的环境变量。
一些其他的工具也可以通过点文件进行配置:
bash
-~/.bashrc
,~/.bash_profile
git
-~/.gitconfig
vim
-~/.vimrc
和~/.vim
目录ssh
-~/.ssh/config
tmux
-~/.tmux.conf
配置文件中需要放些什么?您可以通过在线文档和帮助手册了解所使用工具的设置项。另一个方法是在网上搜索有关特定程序的文章,作者们在文章中会分享他们的配置。还有一种方法就是直接浏览其他人的配置文件:您可以在这里找到无数的dotfiles 仓库 —— 其中最受欢迎的那些可以在这里找到(我们建议您不要直接复制别人的配置)。这里 也有一些非常有用的资源。
本课程的老师们也在 GitHub 上开源了他们的配置文件: Anish, Jon, Jose.
配置文件的一个常见的痛点是它可能并不能在多种设备上生效。例如,如果您在不同设备上使用的操作系统或者 shell 是不同的,则配置文件是无法生效的。或者,有时您仅希望特定的配置只在某些设备上生效。
有一些技巧可以轻松达成这些目的。如果配置文件 if 语句,则您可以借助它针对不同的设备编写不同的配置。例如,您的 shell 可以这样做:
if [[ "$(uname)" == "Linux" ]]; then {do_something}; fi# 使用和 shell 相关的配置时先检查当前 shell 类型if [[ "$SHELL" == "zsh" ]]; then {do_something}; fi# 您也可以针对特定的设备进行配置if [[ "$(hostname)" == "myServer" ]]; then {do_something}; fi
如果配置文件支持 include 功能,您也可以多加利用。例如:~/.gitconfig
可以这样编写:
[include] path = ~/.gitconfig_local
然后我们可以在日常使用的设备上创建配置文件 ~/.gitconfig_local
来包含与该设备相关的特定配置。您甚至应该创建一个单独的代码仓库来管理这些与设备相关的配置。(相当于对文件进行映射,你不必要对本地的点文件做太多的写入。)
如果您希望在不同的程序之间共享某些配置,该方法也适用。例如,如果您想要在 bash
和 zsh
中同时启用一些别名,您可以把它们写在 .aliases
里,然后在这两个 shell 里应用:
# Test if ~/.aliases exists and source itif [ -f ~/.aliases ]; then source ~/.aliasesfi
一些遇到的麻烦
为什么在WSL ubuntu的环境下,执行笨笨py代码过程中按ctrl+\没有发出SIGQUIT信号?
实际上为:WSL其实收到了SIGQUIT的信号,但没有实现对这个信号的处理,并不是信号没有发出。
可以看这些链接帮助理解:https://github.com/microsoft/WSL/issues/169,https://www.zhihu.com/question/338541555
课后习题
任务控制
我们可以使用类似
ps aux | grep
这样的命令来获取任务的 pid ,然后您可以基于pid 来结束这些进程。但我们其实有更好的方法来做这件事。在终端中执行sleep 10000
这个任务。然后用Ctrl-Z
将其切换到后台并使用bg
来继续允许它。现在,使用pgrep
来查找 pid 并使用pkill
结束进程而不需要手动输入pid。(提示:: 使用-af
标记)。-a, --list-full#List the full command line as well as the process ID. (pgrep only.) -f, --full#The pattern is normally only matched against the process name. When -f is set, the full command line is used.
# 可以用pkill直接全沙掉gfcat030@DESKTOP-KUSC3EH:~$ jobs [1] Running sleep 200 & [2]- Running sleep 2000 & [3]+ Running sleep 3000 & gfcat030@DESKTOP-KUSC3EH:~$ pkill sleep [1] Terminated sleep 200 [2]- Terminated sleep 2000 [3]+ Terminated sleep 3000 # 这样操作gfcat030@DESKTOP-KUSC3EH:~$ sleep 10000# press Ctril-Z# output: [1] + 29705 suspended sleep 10000gfcat030@DESKTOP-KUSC3EH:~$ bg %1# output: [1] + 29705 continued sleep 10000gfcat030@DESKTOP-KUSC3EH:~$ pgrep -af "sleep"# output: 29705gfcat030@DESKTOP-KUSC3EH:~$ pkill -af "sleep"# output: [1] + 29705 terminated sleep 10000
如果您希望某个进程结束后再开始另外一个进程, 应该如何实现呢?在这个练习中,我们使用
sleep 60 &
作为先执行的程序。一种方法是使用wait
命令。尝试启动这个休眠命令,然后待其结束后再执行ls
命令。但是,如果我们在不同的 bash 会话中进行操作,则上述方法就不起作用了。因为
wait
只能对子进程起作用。之前我们没有提过的一个特性是,kill
命令成功退出时其状态码为 0 ,其他状态则是非0。kill -0
则不会发送信号,但是会在进程不存在时返回一个不为0的状态码。请编写一个 bash 函数pidwait
,它接受一个 pid 作为输入参数,然后一直等待直到该进程结束。您需要使用sleep
来避免浪费 CPU 性能。# 用wait可以这样做gfcat030@DESKTOP-KUSC3EH:~/missingsem$ sleep 60 &gfcat030@DESKTOP-KUSC3EH:~/missingsem$ pgrep "sleep" | wait && ls#用脚本就这样gfcat030@DESKTOP-KUSC3EH:~/missingsem$ cat pidw.sh#!usr/bin/env bash dwait() {while kill -0 $1 2>/dev/null # catch stderr to /dev/nulldo sleep 1 done ls }gfcat030@DESKTOP-KUSC3EH:~/missingsem$ source pidwait.shgfcat030@DESKTOP-KUSC3EH:~/missingsem$ sleep 60 &gfcat030@DESKTOP-KUSC3EH:~/missingsem$ pidwait $(pgrep "sleep")
终端多路复用
请完成这个 tmux
教程 参考这些步骤来学习如何自定义 tmux
。
别名
创建一个
dc
别名,它的功能是当我们错误的将cd
输入为dc
时也能正确执行。gfcat030@DESKTOP-KUSC3EH:~$ alias dc=cd
执行
history | awk "{$1="";print substr($0,2)}" | sort | uniq -c | sort -n | tail -n 10
来获取您最常用的十条命令,尝试为它们创建别名。注意:这个命令只在 Bash 中生效,如果您使用 ZSH,使用history 1
替换history
。
配置文件
让我们帮助您进一步学习配置文件:
- 为您的配置文件新建一个文件夹,并设置好版本控制
- 在其中添加至少一个配置文件,比如说您的 shell,在其中包含一些自定义设置(可以从设置
$PS1
开始)。 - 建立一种在新设备进行快速安装配置的方法(无需手动操作)。最简单的方法是写一个 shell 脚本对每个文件使用
ln -s
,也可以使用专用工具 - 在新的虚拟机上测试该安装脚本。
- 将您现有的所有配置文件移动到项目仓库里。
- 将项目发布到GitHub。
-
The Missing Semester - 第五讲 学习笔记
第五讲命令行环境课程视频地址:https: www bilibili com video BV1Dy4y1a7BW课程讲义地址:https: missing-semester-cn gith
来源: -
全球今日讯!打开MASA Blazor的正确姿势5:插槽
依照Vuetify的习惯,MASABlazor将RenderFragment称为插槽。RenderFragment是Blazor的一个难点...
来源: The Missing Semester - 第五讲 学习笔记
记录--在Vue3这样子写页面更快更高效
全球今日讯!打开MASA Blazor的正确姿势5:插槽
全球焦点!弯道超车成功!中国新能源汽车产销量全世界第一
每日关注!“准点下班被辞”女子申请赔偿一个月工资 公司回应:等仲裁结果
定位解析一个因脚本劫持导致webpack动态加载异常的问题
全球热文:python名称空间和作用域
天天实时:定位Dll加载异常的方法
环球热资讯!《进击的巨人》最终季完结篇开播 前篇拿下豆瓣9.7分:改编超越原作
核心部件100%国产!东风新一代商乘通用氢燃料电池产品完成
世界热文:同档网络无敌!一加Ace 2V搭载自研的游戏云专网技术
第五章 运输层
代表建议试行十二年义务教育:中考定终身太早 拒绝小学初中内卷
一男子和峨眉山猴子练搏击互殴 当事人回应:条件反射、请勿模仿
【全球新要闻】(数据库系统概论|王珊)第九章关系查询处理和关系优化-第二节:查询优化
轻松玩转Makefile | 企业项目级Makefile实例
精选! 《狂飙》“大嫂”高叶上手小米13:徕卡人像实拍样张美呆
天天时讯:3端通用!腾讯视频VIP会员年卡148元到手
当前快讯:董明珠称格力不看文凭只看能力:研究生到一线生产线非人才
济南动物园网红小黑猩猩“柒仔”去世:初步研判系突发疾病死亡
每日热议!奔驰4S店展车充新车 女子上门维权:被骗了、将走法律程序
天天快资讯丨突发!蔚来前实习生称遭同事强奸未遂 反被拒绝留用!公司:已成立调查组
“清籁”琴
环球观点:5-Nacos注册中心
灭蟑螂小窍门厨房_灭蟑螂小窍门
关于目录问题的总结-Python
天天即时看!实现js继承的几种方式以及他们的优缺点
今热点:AI修复图片画质和视频画质的方法
【热闻】数学建模(一):LP 问题
【新要闻】如何去除新家的甲醛_如何去除新家的甲醛
2023年2月随笔-难产的“学系列”
关注:乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 深入OpenAI与马斯克、微软的秘密,通过API轻松接入ChatGPT
天天热推荐:git clone的时候出现出现 fatal: unable to access 'https://github.com/...':OpenSSL
第125篇: 期约Promise基本特性
环球速递!kong和konga的安装部署
视焦点讯!腾讯云短信的使用方法
06while循环
环球热头条丨外星人AW620M无线鼠标上市:26000 DPI、140小时长续航
世界简讯:PC优化翻车!《卧龙:苍天陨落》官方道歉:将尽快推出更新补丁
环球头条:多线程全面总结
怎么注册微信公众号?
Pro版同款!荣耀Magic5至臻版影像泄露:5000万像素旗舰三摄
今日要闻!《LOL》英雄价格正式调整!全面下调
全球热议:理想L9车主实惨:白天打开星环模式灯 扣1分罚款100元?
iPhone良品率不足50%也不怕 富士康又在印度设立新工厂
小鹏汽车欲靠P7“回血”:老款清库再降3.5万、新车下周上市
降价后真香了!特斯拉中国2月销量出炉:暴涨130%
9.98万起杀疯!比亚迪王朝系列2月销量超10万台:秦PLUS贡献3成
2月新能源汽车销量榜:比亚迪一家占比近4成 第三名暴走
世界资讯:委员蒋胜男谈35岁职场危机:根源是“996” 必须改变
今日讯!中国性能车!全新领克03 TCR赛车官图发布:售价超百万
排查系统执行SQL与数据库直接执行结果不一致的问题
每日资讯:详细剖析|袋鼠云数栈前端框架Antd 3.x 升级 4.x 的踩坑之路
记录--手摸手带你撸一个拖拽效果
天天讯息:VSCode官方的配置同步方案
快报:144MB缓存立大功 AMD锐龙7000X3D内存自由:4800都稳赢i9
环球观点:AMD RX 7900 XT价格全面雪崩:沦落到RTX 4070 Ti的级别
《旷野之息》发售6周年:续作《塞尔达传说:王国之泪》发布新预告
当前视点!中国围棋第一人易主!李轩豪超越柯洁 AI立大功
环球快讯:vivo推出“手语翻译官”应用:准确率可达80%以上
网络通信——TCP “三次握手“、“四次挥手“ 详解
PHP语言在线代码运行编译工具推荐
今日报丨JavaScript 回调函数属于闭包?
全球快看:ChatGPT开放API,上来就干到最低价,可以人手一个ChatGPT了
全球新动态:Spring事务使用注意事项
【全球独家】限制儿童支付金额方便了!微信青少年模式升级:一键开启上线
三排七座!仰望U8内饰曝光:比亚迪首款百万豪车来了
世界热门:刚失败一次后 日本不放弃:新一代运载火箭尝试再度发射
热到离谱?首个冲上20℃的北方省会诞生 下周或破30℃
欧洲2035年禁售燃油车要黄?德国公然反对!意大利:我也不同意
环球精选!登月用!中国新一代载人火箭预计2027年首飞
天天即时:《狂飙》“大嫂”高叶上手小米13:女神持机美如画
全球观速讯丨火山引擎 DataTester:A/B 实验如何实现人群智能化定向?
环球快资讯丨Redis分布式锁常见坑点分析
世界今日讯!eas里客户端保存,提交里增加校验规则和必填
访问者模式
世界微动态丨网友偶遇眼镜王蛇求助 博物杂志:务必远离、打输住院打赢坐牢
世界今亮点!Vtuber因直播《霍格沃茨之遗》被骚扰 宣布毕业
天天讯息:委员建议研究生招生规模动态扩大:缓解考研难
全球聚焦:收个滴滴Offer:从小伙三面经历,看看需要学点啥?
环球热资讯!Study for Go! Chapter one - Type
环球最新:手写模拟Spring底层原理-Bean的创建与获取
速看:兰博基尼领衔 今年值得期待的7款跑车 买不起还不能看看?
女子试用期被辞退 现场给HR普法:金句频出网友点赞称解气
每日聚焦:靠ChatGPT年入百万!合法还不限学历专业:一般人我不告诉他(doge)
全球新消息丨韩系车日子不好过!起亚狮铂拓界限时优惠:降3万还给大礼包
zip文件结构
头条:与时俱进推动智慧城市建设,智慧管网监测加强城市治理能力
全球视讯!Java项目集成工作流activiti,会签
简单介绍Python中如何给字典设置默认值
播报:LG:三星QD OLED电视更容易烧屏
世界聚焦:掏耳朵怎么就这么爽!
今日视点:不只全面屏!努比亚Z50 Ultra后摄惊艳:黄金镜皇组合
男子月薪3千相亲角“反向相亲”气到大妈 大爷理解:靠颜值吃饭
每日热文:吴京+杰森斯坦森主演!《巨齿鲨2》暑期上映 国内有望同步
环球视点!ffmpeg视频上传及压缩Linux配置篇下
世界快资讯:【Avalonia】【跨平台】关于Prism项目模块化在Linux下路径问题
浙大揭秘吃鱼为什么会变聪明 网友:告诉老默 我想吃鱼了
上海消保委提醒谨慎购买威马汽车:经营异常、消极应对投诉
特斯拉将放弃稀土材料 中国公司无惧:目前没有东西替代