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)分隔path
pwdprint working directory
cdchange directory
.current directory ..parent directory ~表示用户目录,例如在linux中表示/home/dahao,在windows中表示C:\Users\dahao -表示上一个目录

ls man

ls留空表示显示当前目录,后面也可以加例如..来显示其父目录
ls --helphelp ls -llong 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 lsmanual page,可能需要q退出
    Ctrl+Lclean terminal
    在macOS中,xdg-open file用对应软件打开文件

mv cp rm

mvmove and rename
cpcopy and rename
rmremove,linux中不能rm文件夹,因为不是递归删除,需要删除加-r
rmdironly if the directory is empty
mkdir创建新文件夹

input output

<input >output >>append
cat < file表示把file的内容当做input内容,默认output到terminal
cat < 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的administrator
ls /syskernel 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文件中。


The Shell
https://blakehansen130.github.io/2024/10/04/The Shell/
发布于
2024年10月4日
许可协议