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
输入/输出流¶
正常情况下, 通常,一个程序的输入输出流都是您的终端。也就是,键盘作为输入,显示器作为输出
,但我们可以重定向这些流。
- 最简单的是
< 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
- 可以使用
>>
向文件追加内容,将命令的输出追加到文件末尾。
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
- 管道:
|
能够将一个程序的输出和另外一个程序的输入连接起来
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。加载器会执行指定的解释器程序,并将尝试运行脚本时最初使用的路径作为参数传递给它,以便程序可以将该文件用作输入数据。