The Missing Semester of Your CS Education

次林梦叶的小屋 / 2024-10-10 / 原文

image

from pixiv

前言

The missing semester of your CS education

计算机设计的初衷就是任务自动化,然而学生们却常常陷在大量的重复任务中,或者无法完全发挥出诸如 版本控制、文本编辑器等工具的强大作用。效率低下和浪费时间还是其次,更糟糕的是,这还可能导致数据丢失或 无法完成某些特定任务。

这些主题不是大学课程的一部分:学生一直都不知道如何使用这些工具,或者说,至少是不知道如何高效 地使用,因此浪费了时间和精力在本来可以更简单的任务上。标准的计算机科学课程缺少了这门能让计算变得更简捷的关键课程。
---- from Anish, Jose, and Jon

我也会结合其他资料更加完善地学习。

Shell

Bash Quoting(引号)

Quoting is used to remove the special meaning of certain characters or words to the shell.

Bash中常见的引号有:

  • Escape Character(转义符号)

  • Double Quotes(双引号)

    弱去除字符特殊含义的效果:The special parameters ‘*’ ,‘@’,‘!’ ,‘$’,Single Quotes ,‘/’ etc. have special meaning when in double quotes

    我们经常能够看到在写Shell脚本时利用双引号such as "$FILENAME",这样包裹住变量,因为双引号可以防止通配符和单词分割。

  • Single Quotes(单引号)

    有强去除字符特殊含义的效果

在程序间创建连接

在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。

当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。

程序与程序之间是单独运行的,一个说明此的现象是:

$ cd /sys/class/backlight/thinkpad_screen
$ sudo echo 3 > brightness

An error occurred while redirecting file 'brightness'
open: Permission denied

sudo也是一个程序,其执行echo程序。

shell (权限为当前用户) 会先尝试打开 brightness 文件,但此时操作 shell 的不是根(root)用户,所以系统拒绝了这个打开操作,提示无权限。

更改

echo 3 | sudo tee brightness

tee - read from standard input and write to standard output and files

Script

shell 是一个编程环境,所以它具备变量、条件、循环和函数

当你在 shell 中执行命令时,您实际上是在执行一段 shell 可以解释执行的简短代码。

如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去咨询环境变量 $PATH

'#!'

在计算领域中,Shebang(也称为Hashbang)是一个由井号和叹号构成的字符序列#!,其出现在文本文件的第一行的前两个字符。 在文件中存在Shebang的情况下,类Unix操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。

脚本并不一定只有用 bash 写才能在终端里调用。比如说,这是一段 Python 脚本,作用是将输入的参数倒序输出:

#!/usr/local/bin/python
import sys
for arg in reversed(sys.argv[1:]):
    print(arg)

但是上述写法还是有些问题,因为不同机器Python安装路径是不同的。

在 shebang 行中使用 env 命令是一种好的实践,它会利用环境变量中的程序来解析该脚本,这样就提高了您的脚本的可移植性。

env 会利用PATH 环境变量来进行定位。 例如,使用了 env 的 shebang 看上去是这样的 #!/usr/bin/env python

特殊变量

  • 空格

    shell 脚本中使用空格会起到分割参数的作用

    在 bash 中为变量赋值的语法是 foo=bar,访问变量中存储的数值,其语法为 $foo。
    需要注意的是,foo = bar (使用空格隔开)是不能正确工作的,因为解释器会调用程序 foo 并将 = 和 bar 作为参数。

  • image

    from this
    more from this

条件语句

man test

Bash 实现了许多类似的比较操作,您可以查看 test 手册。 在 bash 中进行比较时,尽量使用双方括号 [[ ]] 而不是单方括号 [ ]

if [[ $? -ne 0 ]]; then
        echo "File $file does not have any foobar, adding one"
        echo "# foobar" >> "$file"
fi
  • 同一行的多个命令可以用 ; 分隔。

  • 返回值 0 表示正常执行,其他所有非 0 的返回值都表示有错误发生。

  • 程序 true 的返回码永远是 0,false 的返回码永远是 1。

false ; echo "This will always run"

Shell工具

  • 手册内容太过详实,让我们难以在其中查找哪些最常用的标记和语法。 TLDR pages 是一个很不错的替代品

  • 编写 bash 脚本有时候会很别扭和反直觉。例如 shellcheck 这样的工具可以帮助你定位 sh/bash 脚本中的错误。

    sudo apt install shellcheck
    

    image