目录
以下内容均在WSL的powershell运行
课程内容整理
1.date——获取时间:
memo@Troic16:/$ dateTue Dec 2 09:40:47 CST 20252.echo——参数打印
(包括字符串,变量的值等)
虽然说下面的“Hello World”不加双引号也可以输出,但为了避免特殊参数的干扰还是加上比较好。
也可以用转义字符告诉计算机这个空格也要算进去。
单引号和双引号的区别之后会提到。
memo@Troic16:/$ echo hellohellomemo@Troic16:/$ echo Hello WorldHello Worldmemo@Troic16:/$ echo "Hello World"Hello Worldmemo@Troic16:/$ echo Hello\ WorldHello Worldmemo@Troic16:/$ echo 'Hello World'Hello World3.搜索程序(环境变量$PATH——路径变量)
上面提到了,echo可以打印变量,环境变量当然也是变量,因此可以通过打印路径变量PATH得到计算机查找echo,data这些内置程序的绝对路径
which echo可以返回echo所在的绝对路径
memo@Troic16:~$ echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/d/mingw64/bin:/mnt/c/Program Files (x86)/Windows Kits/10/Windows Performance Toolkit/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Users/zzj06/.cargo/bin:/mnt/d/Scripts/:/mnt/d/:/mnt/c/Users/zzj06/AppData/Local/Programs/Python/Launcher/:/mnt/c/Users/zzj06/AppData/Local/Microsoft/WindowsApps:/mnt/d/Microsoft VS Code/bin:/mnt/c/msys64/ucrt64/bin:/snap/binmemo@Troic16:~$ which echo/usr/bin/echomemo@Troic16:~$ /usr/bin/echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/d/mingw64/bin:/mnt/c/Program Files (x86)/Windows Kits/10/Windows Performance Toolkit/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Users/zzj06/.cargo/bin:/mnt/d/Scripts/:/mnt/d/:/mnt/c/Users/zzj06/AppData/Local/Programs/Python/Launcher/:/mnt/c/Users/zzj06/AppData/Local/Microsoft/WindowsApps:/mnt/d/Microsoft VS Code/bin:/mnt/c/msys64/ucrt64/bin:/snap/bin这里的/usr/bin/echo其实就是用echo的绝对路径运行,等效于echo $PATH,比如:
memo@Troic16:~$ /usr/bin/echo hellohello用相对路径就要保证路径正确了,在不同工作目录的相对路径是不同的,比如:
memo@Troic16:/$ ./usr/bin/echo hellohellomemo@Troic16:/$ cd usrmemo@Troic16:/usr$ ./usr/bin/echo hello-bash: ./usr/bin/echo: No such file or directory4.在shell导航
cd——切换目录,pwd——查看当前目录
根目录——"",主目录——”~“,当前目录——”.”,父目录——”..”,返回上一个目录——”-”
cd 绝对路径——直接到达对应路径
cd 相对路径——从当前工作目录开始导航
memo@Troic16:/usr$ cd ./binmemo@Troic16:/usr/bin$ cd ..memo@Troic16:/usr$ cd -/usr/binmemo@Troic16:/usr/bin$ cd ~memo@Troic16:~$ pwd/home/memomemo@Troic16:~$ cd /home/memo/graph_projectsmemo@Troic16:~/graph_projects$ cd ../../../usr/binmemo@Troic16:/usr/bin$ ./echo hellohellomemo@Troic16:/usr/bin$ pwd/usr/bin5.ls——显示文件
memo@Troic16:/$ lsbin boot etc init lib.usr-is-merged lost+found mnt proc run sbin.usr-is-merged srv tmp varbin.usr-is-merged dev home lib lib64 media opt root sbin snap sys usrmemo@Troic16:/$ ls -ltotal 2740lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -> usr/bindrwxr-xr-x 2 root root 4096 Feb 26 2024 bin.usr-is-mergeddrwxr-xr-x 2 root root 4096 Apr 22 2024 boot太长了就不一一展示了
-l可以显示更加详细的信息,比如rwx就可以反映用户的读写运行的权限(一共有三组rwx, 它们分别代表了文件所有者,用户组(users) 以及其他所有人具有的权限。其中 - 表示该用户不具备相应的权限。从上面的信息来看,只有文件所有者可以修改(w)文件夹 (例如,添加或删除文件夹中的文件)。可以使用chmod开放)
可以用man ls或者ls —help查看更多参数和介绍
6.重定向 —— < , | , >
cat——显示文件信息
避免复制粘贴,简单说就是,< >是在数据流中给出一个方向,让输入输出可以进行传递。比如:
memo@Troic16:~$ echo hello > hello.txtmemo@Troic16:~$ cat hello.txthellomemo@Troic16:~$ cat < hello.txt > hello2.txtmemo@Troic16:~$ cat hello2.txthellomemo@Troic16:~$ echo "world" >> hello2.txtmemo@Troic16:~$ cat hello2.txthelloworld顺带一提,echo ‘world’ >hello2.txt会直接替代掉原文本,>>是给文件追加内容
| 的作用是将上一个程序的输出变成下一个程序的输入,比如:
memo@Troic16:~$ cat hello2.txt | head -1 > hello1.txtmemo@Troic16:~$ cat hello1.txthellomemo@Troic16:~$ cat hello2.txt | tail -1 >> hello1.txtmemo@Troic16:~$ cat hello1.txthelloworld这里吧cat输出的hello\nworld作为head的输入,取第一行,保存进了hello1.txt,因此得到了hello,再取尾部第一行的world,追加进hello1.txt
但是要注意一点的是,重定向的符号两侧只负责传输数据,实际上右侧的程序是不知道左侧发生过了什么的,只是看到有数据传输过来了而已。
下面用sudo来解释这点,当我们尝试修改路径 /sys/class/backlight下的文件的时候,因为没有管理员权限无法修改,自然地我们想着这么去解决
sudo echo 1 > brightness但是这样是错误的,因为根据 ”>” 进行划分我们会发现其实是(sudo echo 1) > (brightness)
而不是sudo(echo 1 > brightness),因此sudo的管理员权限只给到了echo,而不是整个语句。
为什么呢,就是上面提到的重定向的符号只负责传输数据。
不知道你看到这会不会有一种恍然大悟的感觉,反正我是觉得我去这太妙了,之前离散的知识点都被一个例子串起来了,好的例子真的可以让理解加深很多!
我们可以这么操作,这样sudo的权限就给到tee从而就可以对文件进行修改了。
echo 3 | sudo tee brightness7.mkdir——创建文件夹
mkdir + 文件名
memo@Troic16:~$ mkdir missingmemo@Troic16:~$ lsgraph_projects hello.txt hello1.txt hello2.txt last-modified.txt missing my photos projects serverexample需要注意的是如果要建立的文件夹名称带空格,要用引号括起来(mkdir “my photos”,如果用的是my photos就会像上面一样生成两个文件夹,一个是my,一个是photos)。
课后习题
Solution-课程概览与 shell · the missing semester of your cs education
需要注意的是,第五题的semester运行会显示Permission denied,因为用户没有编辑的权限,用chmod -777 文件名放开权限就可以了。
第九题也可以用head和tail混用来获得单行的内容。
WSL的用户没有第十题的文件?其实我前面的brightness和这道题的电量文件夹下面都是空。
部分信息可能已经过时











