理解shell、bash、linux 以及 linux 常用命令

380 阅读9分钟

1. 基础知识

  • Unix不是Linux,Linux是一套免费使用和自由传播的类UNIX操作系统,它主要受到Minix和Unix思想的启发
  • shell,打通了用户与linux的关系,Shell是可以与Linux内核进行交互的
  • linux内核衍生出来的产品

2. 有哪些shell

  • sh
    sh,全名Bourne shell(/usr/bin/sh或/bin/sh)

  • zsh 很多人的 mac 中会使用 zsh 而不是 bash,一大半是因为 oh-my-zsh 这个配置集,它兼容 bash,还有自动补全等好用的功能。 sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 shell。

  • csh
    csh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。

  • tcsh
    tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。 ash一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

  • bash
    bash(全名:Bourne Again Shell)由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 shell 代码可以不加修改地在 bash 中运行。尽管如此,bash 和 sh 还是有一些不同之处:一方面,bash 扩展了一些命令和参数;另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。 (mac上的终端使用的就是bash)

3. 查看shell

  • 当前 Linux或MacOS的默认shell
echo $SHELL

在 mac os 上将输出

/bin/bash
  • 如果想知道自己系统安装了哪些shell
cat /etc/shells

mac os 上的输出结果

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

4. bash 和 zsh的区别

一句话,二者均是shell的一种,zsh能基本完美兼容bash的命令,并且使用起来更加优雅。由于bash或zsh本质上都是解释器,他们所共同服务的是shell语言,因此在命令语法上基本相同,部分兼容性差异可参考:zsh和bash的兼容性差异。 二者切换:

  • 切换bash: chsh -s /bin/bash

  • 切换zsh: chsh -s /bin/zsh

  • 在终端app的系统偏好设置里手动设置。 在配置文件方面:

  • bash读取的配置文件:~/.bash_profile文件

  • zsh读取的配置文件:~/.zshrc文件 当从bash切换为zsh时,如果不想重新配置一遍.zshrc文件,可以在.zshrc文件中加上source ~/.bash_profile,从而直接从.bash_profile文件读取配置。

5. 如何执行 Linux 命令

  • Windows,建议下载git工具,自带git bash,可以直接执行Linux上的命令。
  • macOS,可以用mac自带的terminal,可以直接执行Linux上的命令。
  • Linux,可以直接用Linux自带的terminal执行Linux上的命令。

6. cmd 与 powershell 的关系

  • powershell 是 cmd 的扩展,将很多复杂的指令简单化
  • cmd起源于dos系统,windows里面的cmd其实就模拟一套dos系统,用来运行一些高级命令的。

7. cmd 与 linux 的区别

  • 最根本的区别是linux shell是linux操作系统的一个用户交互层;而cmd只是windows系统下的一个小小的应用
  • shell是介于应用程序和内核之间的壳,所有应用程序要和内核交互都必须要通过shell,包括linux的图形桌面Xwindow;而cmd只是windwows下一个补充,cmd是否存在对windows系统并没有那么重要。
  • linux在没有图形界面下几乎可以完成任何事情,而且比图形桌面更简洁高效,还可以配合shell编程实现自动化;而cmd只是windows下的一个终端模拟器,相当于一个桌面应用,不能单独存在。

8. fish Shell

fishshell.com/ 优势

  1. 自动提示:根据历史记录和完成情况在您键入命令时提供建议
  2. 出色的VGA颜色:支持24位真彩色
  3. 智能的脚本:完全可编写脚本的,其语法简单、干净且一致
  4. ....

查看是否安装完毕:fish --version

查看 fish 的路径:which shell

8.1 设置打开 iterm2 自动开启 fish
  1. echo "/usr/local/bin/fish" | sudo tee -a /etc/shells
    目的是将 "/usr/local/bin/fish" 添加到系统中可用的登录 shell 列表中。这对于更改用户的默认 shell 或允许用户切换到 Fish shell 非常有用,这么操作以后就可以通过 cat /etc/shells 查找到 fish

  2. chsh -s /usr/local/bin/fish,设置 shell 默认为 fish,如果要设置回 bash,就输入 chsh -s /bin/bash

  3. 配置环境变量,这样 npm 全局安装的包才能使用

    打开 /Users/xxxx/.config/fish/config.fish ,配置如下

    if status is-interactive
     # Commands to run in interactive sessions can go here
     set PATH $PATH /Users/tangfeng/.nvm/versions/node/v16.15.1/bin ~/.npm-global/bin /Users/tangfeng/pnpm
    end
    
  • 必须配置node的路径,搜索 which node
  • 同时把 ~/.bash_profile 里面配置的路径拷贝过来
  • 修改完毕以后输入 source ~/.config/fish/config.fish 使其生效
8.2 oh-my-fish

地址

安装:curl -L https://get.oh-my.fish | fish

一些常用的命令

omf list # 显示本地已安装的插件列表。
omf install <theme> # 安装一个主题。
omf theme <theme> # 应用一个主题。查看全部可用主题执行 omf theme。
omf remove <name> # 移除主题或插件。

9. iterm2、terminal

iterm2 以及 mac 自带的 terminal 都是可以执行 shell 的终端模拟器

9.1 iterm2 相对于 terminal 的优势

官网上的介绍:iterm2.com/features.ht…

知乎上面的介绍:zhuanlan.zhihu.com/p/522219724…

  1. 窗口管理:本身集成了 tmux,可以非常方便地把多窗口并列。
  2. 搜索cmd + f or ctrl + f
  3. 命令提示和历史命令补全:终端层面就有着命令提示和历史命令补全功能,按下 Cmd+;(注意这个;也是需要的。

注意: 通常可以采用cmd;+的形式,cmd+会触发放大字体的效果

一定要有历史记录才会生效,否则最终的结果就是字体放大) 即可看到命令提示,Shift+Cmd+; 可看到历史命令

  1. 鼠标与剪贴板体验:鼠标双击、三击分别选中词和句子。按住 Cmd 使用鼠标单击文件名/URL,即可打开相应的文件或网页。 Shift+Cmd+H 可以查看剪贴板历史
  2. 回放(Instant Replay) :终端输出过多,已经被刷掉看不到了?Option+Cmd+B 即可打开一个进度条,倒退到这个窗口之前的快照
  3. 全局搜索:多个tab之间的全局搜索
  4. 密码管理(Password Manager) :对于一些不方便用 SSH key 而需要用密码的场合

image.png

iterm2快捷键

10. Linux 的基本命令

来源: 一份前端够用的 Linux 命令

1. adduser 添加用户 和 passwd 更改密码
# 添加一个名为 git 的用户
adduser git
# 设置 git 用户的密码
passwd git

修改权限,提权 sudo visudo

# Allow git to run any commands anywhere
git ALL=(ALL:ALL) ALL 

git 表示规则应用的用户名 第一个 ALL 表示规则应用于所有 hosts 第二个 ALL 表示规则应用于所有 users 第三个 ALL 表示规则应用于所有 groups 第四个 ALL 表示规则应用于所有 commands

2. ls 列出文件、目录
3. ls -la 由 -a 显示所有文件和目录(包括隐藏)和 -l 显示详细列表组成:

image.png 以 drwxrwxr-x 为例

第 1 位表示文件类型,其中 - 表示普通文件,d 表示目录文件。 第 2 到第 4 位,表示所有者权限,其中 r 表示读权限,w 表示写权限,x 表示可执行权限, -表示无权限 第 5 到第 7 位,表示组用户权限,这里也是 rwx 第 8 到第 10 位,表示其他用户权限,这里是 r-x,表示有可读可执行权限,无写入权限。

像 root 用户创建文件夹的默认权限为 rwxr-xr-x: 而创建文件的默认权限是 rw-r--r--,注意创建文件默认会去掉 x 权限

image.png

4. chown(change owner) 更改文件属主,也可以同时更改文件属组
# -R:递归更改文件属组
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

将 index.html 的所有者更改为 git

[root@iZ2ze www]# chown git index.html
[root@iZ2ze www]# ls -

-rw-r--r-- 1 git  root  0 12月 17 23:54 index.html

将 index.html 的所有者和群组都改为 git

[root@iZ2ze www]# chown git:git index.html
[root@iZ2ze www]# ls -l

-rw-r--r-- 1 git  git   0 12月 17 23:54 index.html
5. chmod 更改文件权限

(1) 使用数字表示
权限除了用 r w x 这种方式表示,也可以用数字表示,数组与字母的对应关系为:

r:4 w:2 x:1 顺序为:rwx 对应的二进制

具体语法

# -R:递归更改文件属组
chmod [-R] xyz 文件或目录

其中 xyz 分别表示 Owner、Group、Others 的权限,如果我们这样设置一个文件的权限

chmod 750 index.html

Owner 的权限为 7,为可读可写可执行
Group 的权限为 5,为可读可执行,
Others 的权限为 0,表示不可读写不可执行。对应字母为:rwxr-x---

(2) 使用符号类型改变权限的方式
我们将三种身份 OwnerGroupOthers,分别简写为 u(User)go,用 a 表示所有身份,再使用 + - = 表示加入、去除、设定一个权限,r w x 则继续表示读,写,执行权限

chmod u+x,g-x,o-x index.html

意思就是 Owner 加上执行权限,Group 和 Others 去除执行权限

我们也可以直接设定权限

chmod u=rwx,g=rx,o=r index.html

此时文件的权限就相当于 -rwxr-xr-- 此外,我们还可以省略不写 ugoa 这类身份内容,直接写:

chmod +x index.html

此时相当于使用了 a,会给所有身份添加执行权限。

6. su 切换身份
# 切换为 git 用户
su git
7. whoami 显示用户名
# whoami 
root
8. pwd(print working directory) 显示当前目录
[git@iZ2ze www]$ pwd
/home/www
9. cd 切换工作目录
# 进入 /home/www/
cd /home/www

# 进入自己的主目录
cd ~

# 进入当前目录的上上两层 :
cd ../..
10. mkdir 创建目录
  1. mkdir 创建目录:
mkdir new_folder
  1. mkdir -p 递归创建目录:
mkdir -p one/two/three
11. touch 创建文件

用于修改文件或者目录的时间属性,当文件不存在,系统会创建空白文件

touch new_file
12. echo 打印输出

echo 是 Shell 命令,用于打印输出:

# 显示转义字符
echo "\"test content\""

创建或覆盖文件内容为 "test content":

echo "test content" > index.html

追加内容,就用 >>

[root@iZ2ze www]# echo "test content" >> index.html
13. cat 连接文件并打印输出
  1. 查看文件内容:
cat ~/.ssh/id_rsa.pub
  1. 清空 index.html 内容:
cat /dev/null > index.html
  1. 把 index.html 的内容写入 second.html:
cat index.html > second.html
  1. 把 index.html 的内容追加写入 second.html:
cat index.html >> second.html
  1. 把 index.html 和 second.html 追加写入 third.html:
cat index.html second.html >> third.html
14. cp 复制文件或目录
# -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
cp –r website/ static

如果只是复制文件,就可以不加 -r

# 把 test.js 复制到 static
cp –r test.js static
15. mv 移动并重命名

文件改名:

mv index.html index2.html

隐藏文件:

# 文件名上加上 .
mv index.html .index.html

移动文件:

# 仅仅移动
mv  /home/www/index.html   /home/static/
# 移动又重命名
mv /home/www/index.html   /home/static/index2.html

批量移动:

mv  /home/www/website/*  /home/www/static
16. rm 删除一个文件或者目录
# 系统会询问
rm file

# -f 表示直接删除
# -r 表示目录下的所有文件删除

# 删除当前目录下的所有文件及目录
rm -r  * 

# 跑路
rm -rf /*

-r, 会提示你是否确定删除,给你一次检查的机会 -f, --force 忽略不存在的文件,从不给出提示。 -i, --interactive 进行交互式删除 如果 rm -r 没有进行提示,那么就 在~/.bashrc文件中添加一行

alias rm='rm -i'

然后 source ~/.bashrc

17. du 用于显示目录或文件的大小
du -h

-   -a或-all 显示目录中个别文件的大小。
-   -b或-bytes 显示目录或文件大小时,以byte为单位。
-   -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-   -D或--dereference-args 显示指定符号连接的源文件大小。
-   -h或--human-readable 以K,M,G为单位,提高信息的可读性。
-   -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
-   -k或--kilobytes 以1024 bytes为单位。
-   -l或--count-links 重复计算硬件连接的文件。
-   -L<符号连接>或--dereference<符号连接> 显示选项中所指定符号连接的源文件大小。
-   -m或--megabytes 以1MB为单位。
-   -s或--summarize 仅显示总计。
-   -S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小
18. Linux 内建 vi 文书编辑器,Vim 是从 vi 发展出来的一个文本编辑器。
19. ssh远程连接工具

注意 ssh 监听是 22 端口。 其基本语法为:

ssh [OPTIONS] [-p PORT] [USER@]HOSTNAME [COMMAND]

监听端口示例:

ssh -p 300 git@8.8.8.8