The Missing Semester of Your CS Education

First Course Overview The Shell

命令行语句

pwd(process[print] working directory) 输出当前位置
cd . 到当前目录
cd .. 上一级目录
cd /cd ~ 回到根目录
cd - 回到跳转前的目录(可在两个目录之间切换)
ls -l 列出当前目录下子文件的详细信息
ls -a 列出所有文件包含隐藏文件
* ? 代替一个字符串 一个字符
mv A B 重命名并可以移动文件
cp A B 复制并可以移动文件
control L 清除终端
cat 打印文件内容到终端上
touch 建立新文件
>> 不覆盖而是叠加
A | B A的输出作为B的输入
grep A B 在A里查找B
man,rm,mkdir,rmdir
> / 覆盖

rm用于无递归删除 -r 递归删除 rmdir仅允许删除空目录

mkdir 创建目录

关于重定向和 cat

1
2
3
4
5
6
7
8
9
10
11
$ echo hello > hello.txt
$ cat hello.txt
hello
$ cat < hello.txt
hello
$ cat < hello.txt > hello2.txt#将txt内容复制到2.txt中
$ cat hello2.txt
hello
$ cat <hello.txt >> hello2.txt
hello
hello

本以为 cat < hello.txt 会报错 cat: hello: No such file or directory。猜想正确工作的原因是“参数”和“输入”的区别(未经验证或查找资料):cat 程序将输入打印在屏幕上,cat hello.txt 中的 hello.txt 是参数,将该文件的内容作为输入;而 cat < hello.txt 是输入重定向,意思也是将文件中的内容作为程序的输入,而不是将文件的内容作为参数,因此二者效果相同。

tee 的小用处

接受输入并将其写入文件

1
# echo 500 > brightness(sudo su后) == ehco 500 | sudo tee brightness 
1
2
3
4
$ cd /sys/class/backlight/thinkpad_screen
$ sudo echo 3 > brightness
An error occurred while redirecting file 'brightness'
open: Permission denied

出乎意料的是,我们还是得到了一个错误信息。毕竟,我们已经使用了 sudo 命令!关于 shell,有件事我们必须要知道。|>、和 < 是通过 shell 执行的,而不是被各个程序单独执行。 echo 等程序并不知道 | 的存在,它们只知道从自己的输入输出流中进行读写。 对于上面这种情况, shell (权限为您的当前用户) 在设置 sudo echo 前尝试打开 brightness 文件并写入,但是系统拒绝了 shell 的操作因为此时 shell 不是根用户。

明白这一点后,我们可以这样操作:

1
$ echo 3 | sudo tee brightness 

因为打开 /sys 文件的是 tee 这个程序,并且该程序以 root 权限在运行,因此操作可以进行。

当有权限修改文件但无法修改文件所在目录时,即无法删除文件,只可将其制空

1
$ xdg-open binary name#适用Linux just open on the Mac system Windows didn't work

Shell Tools and Scripting

1
2
~/m/tools > > >echo "value is $foo"
value is bash
1
2
~/m/tools > > >echo 'value is $foo'
vlaue is $foo