Thank IT

以应用为导向的个人博客。日拱一卒,功不唐捐,以此共勉。

0%

Bash Shell 学习笔记

查看系统支持的 shell 与默认的 shell

1
2
3
4
docker run -it centos bash
docker ps -a
docker start b4809e7f9e71
docker exec -it b4809e7f9e71 bash

查看当前系统支持的 shell cat /etc/shells

1
2
3
4
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

Mac 系统上 cat /etc/shells

1
2
3
4
5
6
7
8
9
10
11
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

/bin/sh (已经被 /bin/bash 所取代) /bin/bash (就是 Linux 默认的 shell) /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash) /bin/tcsh (整合 C Shell ,提供更多的功能) /bin/csh (已经被 /bin/tcsh 所取代) /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell) 查看当前系统的默认 shell echo $SHELL

1
/bin/zsh

/bin/bash 是二进制文件 下载 bash 源码 Read the Source Code of Shell Commands 写一个简单的 shell

I/O 重定向

输出重定向

我们使用 “>” 重定向符,其后跟着文件名,来重定向标准输出到一个文件而不是屏幕。 为什么我们要这样做呢?因为有时候把一个命令的运行结果存储到一个文件很有用处。

1
ls -l /usr/bin > ls-output.txt

“>” 总是从头开始写文件。所以如果我们需要删除一个文件内容(或者创建一个新的空文件) 就可以用

1
> ls-output.txt

使用 “>>” 操作符,可以将输出结果添加到文件内容之后。如果文件不存在,文件会被创建。

1
ls -l /usr/bin >> ls-output.txt

下面这个命令发生错误时,将会导致 ls-output.txt 被清空,因为标准错误并没有被重定向

1
ls -l /bin/usr > ls-output.txt

重定向标准错误

1
ls -l /bin/usr 2> ls-error.txt

文件描述符 “2”,紧挨着放在重定向操作符之前。 文件描述符 0,1 和 2 分别对应标准输入,输出和错误。 一般情况下,每个Linux程序运行时都会创建三个文件流(三个文件): 标准输入流(stdin):stdin的文件描述符为0,Linux程序默认从stdin读取数据。 标准输出流(stdout):stdout 的文件描述符为1,Linux程序默认向stdout输出数据。 标准错误流(stderr):stderr的文件描述符为2,Linux程序会向stderr流中写入错误信息。 重定向标准输出和错误到同一个文件

1
ls -l /bin/usr > ls-output.txt 2>&1

使用这种方法,我们完成两个重定向。首先重定向标准输出到文件 ls-output.txt,然后重定 向文件描述符 2(标准错误)到文件描述符 1(标准输出)使用表示法 2>&1

1
ls -l /bin/usr &> ls-output.txt

处理不需要的输出

1
ls -l /bin/usr 2> /dev/null

“/dev/null” 这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理。

输入重定向

wc -l < users 计算 users 文件中的行数,等同于 wc -l users

移动光标

命令行中移动光标

Ctrl + a

光标移动到行首(Ahead of line)

Ctrl + e

光标移动到行尾(End of line)

Ctrl + f

光标向前(Forward)移动一个字符位置

Ctrl + b

光标往回(Backward)移动一个字符位置

Alt + f (Mac Fn+option = Alt)

光标向前(Forward)移动到下一个单词

Alt + b (Mac Fn+option = Alt)

光标往回(Backward)移动到前一个单词

Ctrl + d

删除光标所在的一个字符

Ctrl + h

退格删除一个字符,相当于通常的Backspace键 H is the ASCII BS (Backspace) character

Ctrl + l

清屏,相当于执行clear命令

Ctrl + U

剪切光标之前的所有文本。

Ctrl + K

剪切光标之后的所有文本。

Ctrl + W

剪切光标之前的一个单词。

Ctrl + Y

粘贴剪切的内容,与 Ctrl + W和 Ctrl + U配合使用。

Bash Keyboard Shortcuts mac 下使用 iTerm 终端工具无法使用 alt+b 和 alt+f 快捷键的解决方法

vi 移动光标

l or 右箭头 向右移动一个字符 h or 左箭头 向左移动一个字符 j or 下箭头 向下移动一行 k or 上箭头 向上移动一行 0 (零按键) 移动到当前行的行首。 ˆ 移动到当前行的第一个非空字符。 $ 移动到当前行的末尾。 w 移动到下一个单词或标点符号的开头。 W 移动到下一个单词的开头,忽略标点符号。 b 移动到上一个单词或标点符号的开头。 B 移动到上一个单词的开头,忽略标点符号。 Ctrl-f or Page Down 向下翻一页 Ctrl-b or Page Up 向上翻一页 numberG 移动到第 number 行。例如,1G 移动到文件的第一行。 G 移动到文件末尾。 vi 中的许多命令都可以在前面加上一个数字,比方说上面提到的 “G” 命令。在命令之前加 上一个数字,我们就可以指定命令执行的次数。例如,命令 “5j” 导致 vi 向下移动 5 行。

管道线

有时候,我们可以把两个命令连起来使用,一个命令的输出作为另一个命令的输入,这就叫做管道。为了建立管道,需要在两个命令之间使用竖线()连接。 管道是Linux进程之间一种重要的通信机制;除了管道,还有共享内存、消息队列、信号、套接字(socket) 等进程通信机制。 管道使用竖线()将两个命令隔开,竖线左边命令的输出就会作为竖线右边命令的输入。连续使用竖线表示第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

常用的命令

type

type - 显示命令的类型 alias:别名。 keyword:关键字,Shell保留字。 function:函数,Shell函数。 builtin:内建命令,Shell内建命令。 file:文件,磁盘文件,外部命令。 unfound:没有找到 https://man.linuxde.net/type

help & man & info & —help

help - 得到 shell 内部命令的帮助文档 man –显示命令手册页 许多希望被命令行使用的可执行程序,提供了一个正式的文档,叫做手册或手册页 (man page)。一个特殊的叫做 man 的分页程序,可用来浏览他们。 info – 显示程序 Info 条目 同 man 的应用场景一致,但 info 查询所显示的信息比 man 更为完整,它将说明文件数据拆成了一个个段落的形式,每个段落都有自己的页面来撰写,还有超链接可以跳转到各个页面中去,每个页面成为一个 node。这要求目标数据的说明文件必须是以info格式写成的才可以使用info来查询。 许多可执行程序支持一个 “—help” 选项,可以试一试来获得用法信息。

which & apropos & whatis

which – 显示一个可执行程序的位置 这个命令只对可执行程序有效,不包括内部命令和命令别名, apropos –显示一系列适合的命令 等同于 man -k whatis –他是一个可执行程序,用来显示一个命令的简洁描述 等同于 man -f

alias

alias –创建命令别名 alias name=’command1; command2; command3…’ 删除别名,使用 unalias 命令 unalias name 要查看所有定义在系统环境中的别名,使用不带参数的 alias 命令

history & Ctrl + r

history 显示历史列表 history less history grep /usr/bin !88 bash 会把 “!88” 展开成为历史列表中 88 行的内容 Ctrl + r 调用历史命令 在 bash 界面,Ctrl + r 后输入你要搜索的字符,然后 Ctrl + r 可以向上翻,如果你想改动的话,可以用 Ctrl + b 等操作来移动(参考命令行中移动光标),修改,最后按回车 ctrl+r 调用bash曾经的历史命令

less

less 的用法 less /etc/passwd history less Page UP or b 向后翻滚一页 Page Down or space 向前翻动一页 UP Arrow 向前移动一行 Down Arrow 向后移动一行 G 移动到最后一行 1G or g 移动到开头一行 /charaters 向下查找指定的字符串 ?字符串:向上搜索”字符串”的功能 n 向下查找下一个出现的字符串,这个字符串是之前所指定查找的 N:向上重复前一个搜索(与 / 或 ? 有关) h 显示帮助屏幕 q 退出 less 程序

cat

cat 的用法 cat 命令读取一个或多个文件,然后复制它们到标准输出,就像这样: cat ls-output.txt将会显示文件 ls-output.txt 的内容。 cat 经常被用来显示简短的文本文件。因为 cat 可以接受不止一个文件作为参数,所以它也可以用来把文件连接在一起。比方说我们下载了一个大型文件,这个文件被分离成多个部分(USENET 中的多媒体文件经常以这种方式分离),我们想把它们连起来。 cat movie.mpeg.0* > movie.mpeg 如果 cat 没有给出任何参数,它会从标准输入读入数据,因为标准输入,默认情况下,连接到键盘。它正在等待我们输入数据! 下一步,输入 Ctrl-d(按住 Ctrl 键同时按下 “d”),来告诉 cat,在标准输入中,它已经到达文件末尾(EOF):

1
cat > a.txt

grep

grep -打印匹配行 “global regular expression print” grep [options] regex [file…]

选项

描述

-i

忽略大小写。不会区分大小写字符。也可用 —ignore-case 来指定。

-v

不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序只会不包含匹配项的文本行。也可用 —invert-match 来指定。

-c

打印匹配的数量(或者是不匹配的数目,若指定了 -v 选项),而不是文本行本身。也可用 —count 选项来指定。

-l

打印包含匹配项的文件名,而不是文本行本身,也可用 —files-with-matches 选项来指定。

-L

相似于 -l 选项,但是只是打印不包含匹配项的文件名。也可用 —files-without-match 来指定。

-n

在每个匹配行之前打印出其位于文件中的相应行号。也可用 —line-number 选项来指定。

-h

应用于多文件搜索,不输出文件名。也可用 —no-filename 选项来指定。

-r

表示递归查找

以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串”update”的文件,并打印出该字符串所在行的内容,使用的命令为:

1
grep -r update /etc/acpi

查找 mcom-connector.log 中包含 ‘CTW21’ 字符的行。

1
grep 'CTW21' mcom-connector.log

grep 和 find 的区别 grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式进行匹配查找。 find是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间。

find

1
find / -type f -name "xdebug.so"

查找名称为 xdebug.so 的普通文件

sort

sort 的用法 sort testfile 这个 sort 程序对标准输入的内容,或命令行中指定的一个或多个文件进行排序,然后把排序结果发送到标准输出。不改变原文件的内容。 与 cat 类似, sort > foo.txt c b a cat foo.txt a b c 因为 sort 程序能接受命令行中的多个文件作为参数,所以有可能把多个文件合并成一个有序的文件。 例如,如果我们有三个文本文件,想要把它们合并为一个有序的文件,我们可以这 样做: sort file1.txt file2.txt file3.txt > final_sorted_list.txt

xargs

https://www.runoob.com/linux/linux-comm-xargs.html

wc

wc 计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为”-“,则wc指令会从标准输入设备读取数据。 $ wc testfile # testfile文件的统计信息 3 92 598 testfile # testfile文件的行数为3、单词数92、字节数598

touch

touch playground/timestamp 这个创建了一个空文件,名为 timestamp,并且把它的修改时间设置为当前时间。 我们能够通过使用命令,stat 来验证它,stat 是一款加大马力的 ls 命令版本。这个 stat 命令会展示系统对某个文件及其属性所知道的所有信息

mv

mv 移动和重命名文件 mv 操作文件时是移动并且重命名。 目标目录与原目录一致,指定了新文件名,效果就是仅仅重命名。 mv /home/ffxhd/a.txt /home/ffxhd/b.txt 目标目录与原目录不一致,没有指定新文件名,效果就是仅仅移动。 mv /home/ffxhd/a.txt /home/ffxhd/test/ 或者 mv /home/ffxhd/a.txt /home/ffxhd/test 目标目录与原目录一致, 指定了新文件名,效果就是:移动 + 重命名。 mv /home/ffxhd/a.txt /home/ffxhd/test/c.txt

cp

cp 命令使用 -r 参数可以将 packageA 下的所有文件拷贝到 packageB 中: cp -r /home/packageA/* /home/cp/packageB/ 将一个文件夹复制到另一个文件夹下,以下实例 packageA 文件会拷贝到 packageB 中: cp -r /home/packageA /home/packageB 运行命令之后 packageB 文件夹下就有 packageA 文件夹了。

rm

rm [options] name… 参数: -i 删除前逐一询问确认。 -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。 -r 将目录及以下之档案亦逐一删除。

mkdir

mkdir [-p] dirName 在工作目录下,建立一个名为 runoob 的子目录 : mkdir runoob 在工作目录下的 runoob2 目录中,建立一个名为 test 的子目录。 若 runoob2 目录原本不存在,则建立一个。(注:本例若不加 -p 参数,且原本 runoob2 目录不存在,则产生错误。)

1
mkdir -p runoob2/test

ln

ln 软链接: 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式 2.软链接可以跨文件系统 ,硬链接不可以 3.软链接可以对一个不存在的文件名进行链接 4.软链接可以对目录进行链接 硬链接: 1.硬链接,以文件副本的形式存在。但不占用实际空间。 2.不允许给目录创建硬链接 3.硬链接只有在同一个文件系统中才能创建 ln [参数][源文件或目录][目标文件或目录]

1
2
ln fun fun-hard
ln -s fun fun-sym

head & tail & seq

head -n 5 nowcoder.txt 查看前 5 行 tail -n 5 nowcoder.txt 查看最后 5 行 seq 0 7 500 产生 0 到 500 之间每次增加 7 的所有整数

scp

从远程复制到本地 scp {xxx}@{ip}:/etc/nginx/conf.d/remote.nginx.conf.common /Users/local/dir/ Linux scp命令

压缩与打包

.gz gzip 程序压缩的文件; .bz2 bzip2 程序压缩的文件; .tar tar 程序打包的数据,并没有压缩过; .tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩 *.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩 gzip file 当你使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的档名, 原始文件就不再存在了。 cat 可以读取纯文字档,那个 zcat 则可以读取纯文字档被压缩后的压缩档 bzip2, bzcat 若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。 bzip2 真是很不错的东西 虽然 gzip 与 bzip2 也能够针对目录来进行压缩, 不过,这两个命令对目录的压缩指的是『将目录内的所有文件 “分别” 进行压缩』的动作 tar 压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 查 询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录 那个 filename.tar.bz2 是我们自己取的档名,tar 并不会主动的产生创建的档名喔!我们要自订啦! 所以扩展名就显的很重要了! 如果不加 [-j-z] 的话,档名最好取为 .tar 即可。 如果是 -j 选项,代表有 bzip2 的支持,因此档名最好就取为 .tar.bz2 ,因为 bzip2 会产生 .bz2 的扩展名之故! 至於如果是加上了 -z 的 gzip 的支持,那档名最好取为 *.tar.gz 喔。 另外,由於『 -f filename 』是紧接在一起的,过去很多文章常会写成『-jcvf filename』,这样是对的, 但由於选项的顺序理论上是可以变换的,所以很多读者会误认为『-jvfc filename』也可以~事实上这样会导致产生的档名变成 c ! 因为 -fc 嘛!所以罗,建议您在学习 tar 时,将『 -f filename 』与其他选项独立出来,会比较不容易发生问题。 『 -p 』这个选项的原因是为了保存原本文件的权限与属性 一般是拿掉根目录的 如果加上 -P 选项,那么档名内的根目录就会存在喔!不过,鸟哥个人建议,还是不要加上 -P 这个选项来备份! 毕竟很多时候,我们备份是为了要未来追踪问题用的,倒不一定需要还原回原本的系统中! 所以拿掉根目录后,备份数据的应用会比较有弹性!也比较安全呢! 摘自鸟哥的 Linux 私房菜第九章、文件与文件系统的压缩与打包

源文件安装

大部分的 tarball 软件安装步骤:

  1. ./configure 这个步骤就是在创建 Makefile 这个文件罗!通常程序开发者会写一支 scripts 来检查你的 Linux 系统、相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装资讯都是这一步骤内完成的!另外,这个步骤的相关资讯应该要参考一下该目录下的 README 或 INSTALL 相关的文件!
  2. make clean make 会读取 Makefile 中关於 clean 的工作。这个步骤不一定会有,但是希望运行一下,因为他可以去除目标文件!因为谁也不确定原始码里面到底有没有包含上次编译过的目标文件 (*.o) 存在,所以当然还是清除一下比较妥当的。 至少等一下新编译出来的运行档我们可以确定是使用自己的机器所编译完成的嘛!
  3. make make 会依据 Makefile 当中的默认工作进行编译的行为!编译的工作主要是进行 gcc 来将原始码编译成为可以被运行的 object files ,但是这些 object files 通常还需要一些函式库之类的 link 后,才能产生一个完整的运行档!使用 make 就是要将原始码编译成为可以被运行的可运行档,而这个可运行档会放置在目前所在的目录之下, 尚未被安装到预定安装的目录中;
  4. make install 通常这就是最后的安装步骤了,make 会依据 Makefile 这个文件里面关於 install 的项目,将上一个步骤所编译完成的数据给他安装到预定的目录中,就完成安装啦!

通常我们会建议大家将自己安装的软件放置在 /usr/local 下,至於原始码 (Tarball)则建议放置在 /usr/local/src (src 为 source 的缩写)底下啊。 我们晓得几乎每个软件都会提供线上说明的服务,那就是 info 与 man 的功能。 最好将 tarball 的原始数据解压缩到 /usr/local/src 当中; 安装时,最好安装到 /usr/local 这个默认路径下; 考虑未来的反安装步骤,最好可以将每个软件单独的安装在 /usr/local 底下; 为安装到单独目录的软件之 man page 加入 man path 搜寻: 如果你安装的软件放置到 /usr/local/software/ ,那么 man page 搜寻的配置中,可能就得要在 /etc/man.config 内的 40~50 行左右处,写入如下的一行: MANPATH /usr/local/software/man 这样才可以使用 man 来查询该软件的线上文件罗! 摘自鸟哥的 Linux 私房菜第二十二章、软件安装:原始码与 Tarball

patch

patch -p数字 < patch_file 特别留意那个『 -p数字』,那是与 patch_file 里面列出的档名有关的资讯。假如在 patch_file 第一行写的是这样:

1
*** /home/guest/example/expatch.old

那么当我下达『 patch -p0 < patch_file 』时,则升级的文件是『 /home/guest/example/expatch.old 』,如果『 patch -p1 < patch_file』,则升级的文件为『home/guest/example/expatch.old』。 如果『patch -p4 < patch_file』则升级『expatch.old』。 也就是说, -pxx 那个 xx 代表『拿掉几个斜线(/)』的意思! 透过『 patch -R < ../main_0.1_to_0.2.patch 』就可以还原啦!很有趣吧!

md5sum / sha1sum

md5sum / sha1sum 计算文件的指纹码 md5sum/sha1sum [-bct] filename

rpm & dpkg

distribution 代表

软件管理机制

使用命令

线上升级机制(命令)

Red Hat/Fedora

RPM

rpm, rpmbuild

YUM (yum)

Debian/Ubuntu

DPKG

dpkg

APT (apt-get)

使用dpkg命令进行安装。sudo dpkg -i deb文件名 使用rpm命令进行安装。sudo rpm -i 需要安装的包文件名