乙巳🐍年

acc8226 的博客

顺序执行

简单的顺序执行你可以使用;来完成,比如上述操作你可以:

1
2
$ sudo apt-get update;sudo apt-get install some-tool;some-tool
# 让它自己运行

选择执行
可以从$?环境变量获取上一次命令的返回结果
成功则返回 0( 看做 false) , 失败为 1 (看做 true)

&&就是用来实现选择性执行的,它表示如果前面的命令执行结果返回 0 (false)则执行后面的,否则不执行

|| 就是用来实现选择性执行的,它表示如果前面的命令执行结果返回 非0 (true)则执行后面的,否则不执行

如果有则做 -> 为0(false) 再做 ||

1
which cowsay>/dev/null && cowsay -f head-in ohch~

如果没有才做 -> 为1(true)再做 &&

1
which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"

管道

管道是什么?管道是一种通信机制,通常用于进程间的通信(也可通过 socket 进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。

管道又分为匿名管道和具名管道(这里将不会讨论在源程序中使用系统调用创建并使用管道的情况,它与命令行的管道在内核中实际都是采用相同的机制)。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的内容中我们已经多次使用到了。具名管道简单的说就是有名字的管道,通常只会在源程序中用到具名管道。下面我们就将通过一些常用的可以使用管道的"过滤程序"来帮助你熟练管道的使用。

有太多内容,屏幕不能完全显示,这时候可以使用滚动条或快捷键滚动窗口来查看。不过这时候可以使用管道:

1
ls -al /etc | less

通过管道将前一个命令(ls)的输出作为下一个命令(less)的输入,然后就可以一行一行地看。

cut 命令

cut 命令,打印每一行的某一字段

打印 /etc/passwd 文件中以:为分隔符的第 1 个字段和第 6 个字段分别表示用户名和其家目录:

1
cut /etc/passwd -d ':' -f 1,6
1
2
3
4
5
6
7
8
# 前五个(包含第五个)
$ cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
$ cut /etc/passwd -c 5-
# 第五个
$ cut /etc/passwd -c 5
# 2到5之间的(包含第五个)
$ cut /etc/passwd -c 2-5

grep 命令

grep 命令是很强大的,也是相当常用的一个命令,它结合正则表达式可以实现很复杂却很高效的匹配和查找,不过在学习正则表达式之前,这里介绍它简单的使用,而关于正则表达式后面将会有单独一小节介绍到时会再继续学习 grep 命令和其他一些命令。

一般形式

1
grep [命令选项]... 用于匹配的表达式 [文件]...

还是先体验一下,我们搜索 /home/shiyanlou 目录下所有包含 “shiyanlou” 的文本文件,并显示出现在文本中的行号:

1
grep -rnI "shiyanlou" ~

-r 参数表示递归搜索子目录中的文件,-n 表示打印匹配项行号,-I 表示忽略二进制文件。这个操作实际没有多大意义,但可以感受到 grep 命令的强大与实用。

当然也可以在匹配字段中使用正则表达式,下面简单的演示:

1
2
# 查看环境变量中以"yanlou"结尾的字符串
export | grep ".*yanlou$"

其中$就表示一行的末尾。

wc 命令

wc 命令用于统计并输出一个文件中行、单词和字节的数目,比如输出/etc/passwd文件的统计信息:

1
wc /etc/passwd

分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数:

1
2
3
4
5
6
7
8
9
10
# 行数
$ wc -l /etc/passwd
# 单词数
$ wc -w /etc/passwd
# 字节数
$ wc -c /etc/passwd
# 字符数
$ wc -m /etc/passwd
# 最长行字节数
$ wc -L /etc/passwd

再来结合管道来操作一下,下面统计 /etc 下面所有目录数:

1
$ ls -dl /etc/*/ | wc -l

sort 命令

这个命令前面我们也是用过多次,功能很简单就是将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。

默认为字典排序:

1
cat /etc/passwd | sort

反转排序:

1
cat /etc/passwd | sort -r

按特定字段排序:

1
cat /etc/passwd | sort -t':' -k 3

上面的 -t 参数用于指定字段的分隔符,这里是以 “:” 作为分隔符;-k 字段号 用于指定对哪一个字段进行排序。这里 /etc/passwd 文件的第三个字段为数字,默认情况下是以字典序排序的,如果要按照数字排序就要加上 -n 参数:

1
cat /etc/passwd | sort -t':' -k 3 -n

uniq 去重命令

uniq 命令可以用于过滤或者输出重复行。

  • 过滤重复行

我们可以使用 history 命令查看最近执行过的命令(实际为读取${SHELL}_history 文件,如我们环境中的~/.zsh_history 文件),不过你可能只想查看使用了哪个命令而不需要知道具体干了什么,那么你可能就会要想去掉命令后面的参数然后去掉重复的命令:

1
history | cut -c 8- | cut -d ' ' -f 1 | uniq

然后经过层层过滤,你会发现确是只输出了执行的命令那一列,不过去重效果好像不明显,仔细看你会发现它确实去重了,只是不那么明显,之所以不明显是因为 uniq 命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序:

1
2
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u

这就是 Linux/UNIX 哲学吸引人的地方,大繁至简,一个命令只干一件事却能干到最好。

  • 输出重复行
1
2
3
4
# 输出重复过的行(重复的只输出一个)及重复次数
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 输出所有重复的行
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D

systemctl

systemctl 命令有两大类功能:

  • 控制 systemd 系统
  • 管理系统上运行的服务

linux systemctl 命令详解_Linux_脚本之家
https://www.jb51.net/article/136559.htm

find

1
2
# 移除 15 天前不包含当天的安装包
find -maxdepth 1 -mtime +15 -name 'thingsx*.rpm' -exec rm {} \;

关于时间的信息有三个:最近访问时间 access time (-atime)、最近更改时间 modify time (-mtime) 和 最近状态改动时间 change time(-ctime)

使用 find 命令在当前目录不包含子目录中查找文件
-maxdepth 1

-mtime n : n 为数字,意思为在 n 天之前的“一天之内”被更改过内容的文件
-mtime +n : 列出在 n 天之前(不含 n 天本身)被更改过内容的文件名
-mtime -n : 列出在 n 天之内(含 n 天本身)被更改过内容的文件名

授权相关

chmod 命令

chmod 命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。

[u]ser 代表用户.
[g]roup 代表用户组.
[o]thers 代表其他.
a 代表所有

这意味着 chmod u+x somefile 只授予这个文件的所属者执行的权限
= chmod +x somefile 和 chmod a+x somefile 是一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Linux 系统中的每个文件和目录都有访问许可权限,
用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
文件或目录的访问权 限分为只读,只写和可执行三种。

这里显示的权限是依次排列的,分别为:[用户][同组][其他]
用户权限,就是你自己的权限。英文:user,简写:u(覆盖标号123)
用户组权限,就是和你同组的人的权限。英文:group,简写:g(覆盖标号456)
其他权限,就是不和你同组的人的权限。英文:others,简写:o(覆盖标号789)
所有人的权限,英文:all,简写:a

r, 即 Read,读,权限值为4
w,即 Write,写,权限值为2
x,即 eXecute,执行,权限值为1
-,在标号 0 位置,表示普通的文件
-,其他位置,表示对应权限未开启,不具备权限
d,即 directory,表示目录文件

无任何权限:数字 0 表示
开所有权限:数字 7 表示,即 7=4+2+1

chmod 命令是用于改变文件或目录的访问权限。

+ 表示增加权限,如 u+x, u+r, u+w, g+w, g+r, o+r, a+r 等
- 表示取消权限,如 u-x, u-r, u-w, g-w, g-r, o-r, a-r 等
= 表示赋予给定权限,并取消其他所有权限(如果有的话,如原来u是rwx,设置u=r,u就剩r)

chgrp命令

功能:改变文件或目录所属的组。

语法:chgrp [选项] group filename¼

chown 命令

功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如 root 用户把自己的一个文件拷贝给用户 yusi,为了让用户 yusi 能够存取这个文件,root 用户应该把这个文件的属主设为 yusi,否则,用户 yusi 无法存取这个文件。

语法:chown [选项] 用户或组 文件

说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组 ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

其他命令

zcat

zcat 命令用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。用于查看压缩文件的内容,而无需对其进行解压缩。 它将压缩文件扩展为标准输出,使您可以查看其内容。 另外,zcat 与运行 gunzip -c 命令完全相同。

SELinux

它叫做“安全增强型 Linux(Security-Enhanced Linux)”,简称 SELinux,它是 Linux 的一个安全子系统。

  1. 运行 getenforce 命令查看 SELinux 的当前状态。

查看SELinux状态

  • 如果 SELinux 状态参数是 Disabled, 则 SELinux 为关闭状态。
  • 如果 SELinux 状态参数是 Enforcing,则 SELinux 为开启状态。本示例中 SELinux 为开启状态,因此需要关闭 SELinux。

2. 关闭 SELinux。如果 SELinux 为关闭状态可以忽略此步骤。

  • 如果您想临时关闭 SELinux,运行命令 setenforce 0。

说明 这只是暂时关闭 SELinux,下次重启 Linux 后,SELinux 还会开启。

  • 如果您想永久关闭 SELinux,运行命令 vi /etc/selinux/config 编辑 SELinux 配置文件。回车后,把光标移动到 SELINUX=enforcing 这一行,按 i 键进入编辑模式,修改为 SELINUX=disabled, 按 Esc 键,然后输入 :wq 并按Enter 键以保存并关闭 SELinux 配置文件。

说明 如果您想重新开启 SELinux,请参见SELinux 的官方文档

工具软件

rsync

rsync
https://rsync.samba.org/

Rsync 是一个提供快速增量文件传输的开源实用程序。Rsync 在 GNU 通用公共许可协议下可以免费使用,目前由韦恩•戴维森(waynedavison)维护。

参考

重定向怎么用
文件描述符(0,1,2)

在更多了解 Linux 的重定向之前,我们需要先知道一些基本的东西,前面我们已经提到过 Linux 默认提供了三个特殊设备,用于终端的显示和输出,分别为 stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。

文件描述符 设备文件 说明
0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr 标准错误

文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

我们可以这样使用这些文件描述符:

默认使用终端的标准输入作为命令的输入和标准输出作为命令的输出

1
2
$ cat
(按Ctrl+C退出)

将 cat 的连续输出(heredoc 方式)重定向到一个文件

1
2
3
4
5
6
7
8
9
10
11
$ mkdir Documents
$ cat > Documents/test.c <<EOF
#include <stdio.h>

int main()
{
printf("hello world\n");
return 0;
}

EOF

将一个文件作为命令的输入,标准输出作为命令的输出

1
cat Documents/test.c

将 echo 命令通过管道传过来的数据作为 cat 命令的输入,将标准输出作为命令的输出

1
echo 'hi' | cat

将 echo 命令的输出从默认的标准输出重定向到一个普通文件

1
2
echo 'hello shiyanlou' > redirect
cat redirect

此处输入图片的描述

初学者这里要注意不要将管道和重定向混淆,管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接,你可以仔细体会一下上述第三个操作和最后两个操作的异同点。

2 标准错误重定向

重定向标准输出到文件,这是一个很实用的操作,另一个很实用的操作是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。比如下面的操作:

1
2
3
4
5
# 使用cat 命令同时读取两个文件,其中一个存在,另一个不存在
$ cat Documents/test.c hello.c
# 你可以看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息
# 下面我们将输出重定向到一个文件
$ cat Documents/test.c hello.c > somefile

遗憾的是,这里依然出现了那条错误信息,这正是因为如我上面说的那样,标准输出和标准错误虽然都指向终端屏幕,实际它们并不一样。那有的时候我们就是要隐藏某些错误或者警告,那又该怎么做呢。这就需要用到我们前面讲的文件描述符了:

1
2
3
4
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c hello.c > somefile 2>&1
# 或者只用 bash 提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c hello.c &>somefilehell

注意你应该在输出重定向文件描述符前加上**&**,否则 shell 会当做重定向到一个文件名为 1 的文件中

此处输入图片的描述

使用 tee 命令同时重定向到多个文件

你可能还有这样的需求,除了需要将输出重定向到文件,也需要将信息打印在终端。那么你可以使用 tee 命令来实现:

1
echo 'hello shiyanlou' | tee hello

永久重定向

你应该可以看出我们前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到“永久”有效呢,比如在一个脚本中,你需要某一部分的命令的输出全部进行重定向,难道要让你在每个命令上面加上临时重定向的操作嘛,当然不需要,我们可以使用exec 命令实现“永久”重定向。exec 命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:

1
2
3
4
5
6
7
8
# 先开启一个子 Shell
$ zsh
# 使用 exec 替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子 shell,或取消 exec 的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile

创建输出文件描述符

在 Shell 中有 9 个文件描述符。上面我们使用了也是它默认提供的 0,1,2 号文件描述符。另外我们还可以使用 3-8 的文件描述符,只是它们默认没有打开而已。你可以使用下面命令查看当前 Shell 进程中打开的文件描述符:

1
cd /dev/fd/;ls -Al

同样使用 exec 命令可以创建新的文件描述符:

1
2
3
4
5
6
7
8
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile
$ exit

关闭文件描述符

1
2
exec 3>&-
cd /dev/fd;ls -Al;cd -

如上面我们打开的 3 号文件描述符,可以使用如下操作将它关闭.

完全屏蔽命令的输出

在 Linux 中有一个被称为**“黑洞”**的设备文件,所有导入它的数据都将被“吞噬”。

在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个 EOF。

我们可以利用 /dev/null 屏蔽命令的输出:

1
cat Documents/test.c 1>/dev/null 2>&1

上面这样的操作将使你得不到任何输出结果。

xargs

xargs 是一条 UNIX 和类 UNIX 操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

这个命令在有些时候十分有用,特别是当用来处理产生大量输出结果的命令如 find,locate 和 grep 的结果,详细用法请参看 man 文档。

1
cut -d: -f1 < /etc/passwd | sort | xargs echo

上面这个命令用于将 /etc/passwd 文件按 : 分割取第一个字段排序后,使用 echo 命令生成一个列表。

纠结了一阵, 9299 终入手翻新的 13.3 英寸 2017 款 MacBook Pro。它配备了 2.3GHz 双核 英特尔 酷睿 i5 7360U 处理器 ,Retina 显示屏-深空灰色

产品链接: https://www.apple.com/cn/shop/product/FPXT2CH/A

查看电脑信息

拿到一台 mac, 可首先查看电脑基本信息。

点击屏幕左上角苹果图标,在下拉菜单中,点击选择“关于本机”,可以查看本机的基本信息。

熟悉硬件

触摸板输出

macOS 一个很好用的原因,就是在于支持多点触控的触控板包含丰富的预设手势,可以很方便的帮助我们在没有鼠标的情况下完成很多操作。想要了解这些手势的话,最简单的方式是进入「系统偏好设置 - 触控板」,在这里面,可以查看当前已经开启的手势,并且每个手势都有对应的演示动画,你也可以自己设置某些操作手势。

阅读全文 »
0%