The Shell
The Shell
刚启动shell terminal的时候出现的是shell prompt
shell是一门编程语言,依靠invariable environment
date echo which
date
显示日期echo "string"
回复字符串内容echo $PATH
查看路径which echo
查看echo程序位置
path
linux和macOS中用/(forward slash)分隔path,windows中用(back slash)分隔pathpwd
print working directorycd
change directory.
current directory ..
parent directory ~
表示用户目录,例如在linux中表示/home/dahao,在windows中表示C:\Users\dahao -
表示上一个目录
ls man
ls
留空表示显示当前目录,后面也可以加例如..来显示其父目录ls --help
help ls -l
long list help
每三个字母为一组,第一组为user owner的权限,第二组为group owner的权限,第三组为everyone else,每行的第一个字母表示文件的类型或文件夹
- d: 代表这是一个目录 (directory)。
- -: 代表这是一个普通文件 (regular file)。
- l: 代表这是一个符号链接 (symbolic link)。
- b: 代表这是一个块设备文件 (block special file)。
- c: 代表这是一个字符设备文件 (character special file)。
- p: 代表这是一个管道文件 (FIFO pipe)。
- s: 代表这是一个套接字文件 (socket)。
其中write的权限,对于文件夹来说表示可以在其中rename\create\remove files。例如对文件夹中的某个文件具有write权限,但对文件夹没有write权限,那么只能把文件内容清空而不能把这个文件从文件夹中删掉。
execute权限表示想访问一个文件(夹)就需要对它和它父目录有execute权限。man ls
manual page,可能需要q退出Ctrl+L
clean terminal
在macOS中,xdg-open file
用对应软件打开文件
mv cp rm
mv
move and renamecp
copy and renamerm
remove,linux中不能rm文件夹,因为不是递归删除,需要删除加-r
rmdir
only if the directory is emptymkdir
创建新文件夹
input output
<
input >
output >>
appendcat < file
表示把file的内容当做input内容,默认output到terminalcat < file > file2
表示output到file2中tail -n+number
例如tail -n2
表示print最后2行A | B
把A代码段的输出作为B代码段的输入,A和B彼此不知
重定向的优先级更高
root
linux和macOS的root用户id是0,是super user(su),类似于windows的administratorls /sys
kernel parameters$
表示你不是在以root方式运行 #
相反sudo su
获得root权限 exit
退出
例如echo 1060 | sudo tee brightness
表示先把1060作为输入内容,再获得管理员权限并同时输出到brightness文件和terminal screen
为什么sudo echo 500 > brightness
不行而echo 500 | sudo tee brightness
可以
原因:sudo echo 500 > brightness
为什么不行?
- 重定向优先级高于 sudo: 在这个命令中,Shell首先会执行重定向操作
> brightness
,试图将echo 500
的输出重定向到brightness
文件。 - 权限不足: 在执行重定向时,Shell发现你没有写入
brightness
文件的权限,因此报错“不允许”。 - sudo 权限范围: 即使你使用了
sudo
,它也只是提升了echo
命令的权限,并没有提升 Shell 执行重定向操作的权限。echo 500 | sudo tee brightness
为什么可以? - 管道操作:
|
符号表示管道,将echo 500
的输出作为sudo tee brightness
的输入。 - sudo tee 权限:
sudo tee brightness
这部分命令由sudo
提升了权限,因此可以将数据写入brightness
文件。 - tee 命令的作用:
tee
命令可以同时将标准输入的内容输出到标准输出和指定的文件。
总结: - 重定向操作发生在 sudo 之前: 在
sudo echo 500 > brightness
中,重定向操作先于sudo
执行,导致权限不足。 - 管道操作将输出交给 sudo 处理: 在
echo 500 | sudo tee brightness
中,重定向操作通过管道交给sudo tee
处理,从而绕过了权限问题。
exercise
使用echo $SHELL
命令可以查看您的shell是否满足要求。如果打印结果为/bin/bash
或/usr/bin/zsh
则证明可以使用类Unix shell的。
如何使用shell,将以下内容一行一行地写入 semester 文件:
#!/bin/sh curl --head --silent https://missing.csail.mit.edu
答案:echo '#!/bin/sh' > semester
echo 'curl --head --silent https://missing.csail.mit.edu' >> semester
为什么使用单引号而不是双引号?
- 单引号: 单引号内的所有字符都会被原样输出,包括特殊字符(如$、`、\等)。也就是说,单引号内的内容不会被shell解释。
- 双引号: 双引号内的部分特殊字符会被shell解释,比如变量会被替换,命令替换也会执行。
为什么 # 和 ! 不需要转义? - #号: 在shell脚本中,#号通常表示注释。当shell遇到#号时,会忽略该行#号后面的所有内容。但是,当#号被包含在单引号或双引号中时,它就失去了注释的作用,而被视为普通字符。
- !号:!号在shell中也有多种用途,但在这里,它只是字符串的一部分,不需要转义。
- 如果要在单引号中包含单引号本身,需要使用转义字符'。
- 如果需要在单引号中嵌入变量,可以先将变量的值赋值给另一个变量,然后使用双引号包裹这个变量。
chmod
可以通过修改 chmod 命令中的字母来赋予文件不同的权限。
权限字母详解
- u: 表示文件所有者 (user)
- g: 表示与文件所有者同组的用户 (group)
- o: 表示其他用户 (others)
- a: 表示所有用户 (all users,即 u、g、o 的总和)
- +: 增加权限
- -: 删除权限
- =: 设定权限(仅设置指定的权限,其他权限取消)
- r: 读权限
- w: 写权限
- x: 执行权限
举例
chmod g-w semester: 取消同组用户的写权限
chmod o=r semester: 仅给其他用户赋予读权限,其他权限取消
chmod a+x semester: 给所有用户增加执行权限
数字表示法
除了使用字母表示,还可以使用数字表示权限,每个数字代表一组权限:
- rwx: 7
- rw-: 6
- r-x: 5
- r–: 4
- -wx: 3
- -w-: 2
- –x: 1
- —: 0
例如:
chmod 755 semester: 表示文件所有者有读、写、执行权限,同组用户和其他人有读和执行权限。
Shebang 行(#!)的作用:
解释器指定: Shebang 行(#!)位于脚本的第一行,其后紧跟着解释器的路径。这行告诉系统,用指定的解释器来执行这个脚本。
示例: #!/bin/sh 表示使用 /bin/sh 这个 shell 来解释执行脚本。
作用: 当系统执行一个脚本时,会首先读取 Shebang 行,然后找到指定的解释器,并把脚本的内容传递给解释器执行。
获取修改时间: - 方法一:
stat -c %y semester | cut -d ' ' -f 1 > ./last-modified.txt
stat -c %y semester:获取semester文件的修改时间,并以年-月-日的格式输出。
cut -d ‘ ‘ -f 1:从输出结果中提取第一个字段(即日期),也就是修改时间。~/last-modified.txt:将提取到的修改时间重定向到当前用户主目录下的last-modified.txt文件中。
- 方法二:
ls -l semester | awk '{print $6" "$7}' | cut -d ' ' -f 1 > ./last-modified.txt
ls -l semester:以长格式列出semester文件的信息,包括修改时间。
awk ‘{print $6” “$7}’:提取输出中的第6和第7个字段,即月日和时间。
cut -d ‘ ‘ -f 1:从提取到的结果中提取第一个字段(即日期),也就是修改时间。~/last-modified.txt:将提取到的修改时间重定向到当前用户主目录下的last-modified.txt文件中。