跳转至

SHELL BASIC

shell一些基本概念说明

引入

lyx@FIELDREPLAY:~$
  • lyx: 当前用户名
  • missing: 当前主机名
  • ~: 当前目录
  • $: 表示我不是root,#是root
lyx@FIELDREPLAY:~$ which date
/usr/bin/date
lyx@FIELDREPLAY:~$

shell基于空格分隔命令, 所以命令参数中带空格的话,要用转义符,如My\ Photos

深入

其实,类似于 Python 或 Ruby,shell 是一个编程环境,所以它具备变量、条件、循环和函数(下一课进行讲解)。当你在 shell 中执行命令时,您实际上是在执行一段 shell 可以解释执行的简短代码,或者说程序。如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去咨询环境变量 $PATH。

lyx@FIELDREPLAY:~$ echo $PATH
/home/lyx/.local/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

在这些路径中,shell会搜索有没有叫比如echo的程序

lyx@FIELDREPLAY:~$ which date
/usr/bin/date
lyx@FIELDREPLAY:~$ /usr/bin/date
Sat Mar 29 14:46:27 CST 2025

导航

shell中的路径是一组被分割的目录,在linux和mac上用/,而在windows上用\。以/开头的是绝对路径,此外都是相对路径。

lyx@FIELDREPLAY:~$ pwd
/home/lyx
lyx@FIELDREPLAY:~$ ls -a
.              ..            .vscode          后面还有很多
lyx@FIELDREPLAY:~$ ls -l
total 1027624
drwxr-xr-x  7 lyx lyx      4096 Dec 25 00:48 BS
drwxr-xr-x  2 lyx lyx      4096 Oct 12 22:11 CN_lab1
drwxr-xr-x  5 lyx lyx      4096 Oct 25 22:21 CN_lab2

-l的结果中: - 第一个d是目录的意思 - 然后三组三个字符,分别代表文件所有者,用户组,和其它人拥有的权限。 - read,write,execute

[!TIP]

如果不知道命令是干什么的,可以装一个tldr: https://github.com/tldr-pages/tldr

如果怕输错命令改着很麻烦,可以装一个fuck: https://github.com/nvbn/thefuck

输入/输出流

正常情况下, 通常,一个程序的输入输出流都是您的终端。也就是,键盘作为输入,显示器作为输出

,但我们可以重定向这些流。

  1. 最简单的是< file,> file,把程序的输入输出流连接到文件。
lyx@FIELDREPLAY:~$ echo disco > disco.txt
lyx@FIELDREPLAY:~$ cat disco.txt
disco
lyx@FIELDREPLAY:~$ cat < disco.txt
disco
lyx@FIELDREPLAY:~$ cat < disco.txt > disco2.txt
lyx@FIELDREPLAY:~$ cat disco2.txt
disco
  1. 可以使用>>向文件追加内容,将命令的输出追加到文件末尾。
lyx@FIELDREPLAY:~$ echo "what" >> disco.txt
lyx@FIELDREPLAY:~$ cat disco.txt
disco
what
lyx@FIELDREPLAY:~$ echo "what again" > disco.txt
lyx@FIELDREPLAY:~$ cat disco.txt
what again
  1. 管道:|能够将一个程序的输出和另外一个程序的输入连接起来

Root用户

值得注意的是:|>、和 < 是通过 shell 执行的,而不是被各个程序单独执行。像echo这种程序只知道在从自己的输入输出流中读写。

所以如$ sudo echo 3 > brightness这样的语句,sudo只作用于echo,如果brightness文件是需要sudo权限,那就坏了,因为shell还是以普通用户权限试图打开它。此时就需要管道和tee了: $ echo 3 | sudo tee brightness

执行文件

  • 在 Linux 中, 解释器指定的文件如果具有执行权限,并且是下列之一,则可以执行:

  • 本机可执行文件,例如 ELF 二进制文件

  • 通过 binfmt_misc 机制注册了解释器的任何类型的文件(例如使用 wine 执行 Microsoft .exe 二进制文件)
  • 另一个以 shebang 开头的脚本。#! 开头的文件被使用时,文件首行的其余部分解析为解释器指令 ,如文件以 #! /bin/sh 开头,则程序加载器会指示运行程序 /bin/sh。加载器会执行指定的解释器程序,并将尝试运行脚本时最初使用的路径作为参数传递给它,以便程序可以将该文件用作输入数据。