From b3c85197a91b81d320da1d9ea7610c740e3c4d30 Mon Sep 17 00:00:00 2001 From: yeximing Date: Sun, 21 Jul 2024 11:20:37 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E9=A6=96=E6=AC=A1=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\345\234\260\346\217\220\351\227\256.md" | 17 +++ ...6\246\202\350\247\210\344\270\216shell.md" | 115 ++++++++++++++++ ...67\345\222\214\350\204\232\346\234\254.md" | 127 ++++++++++++++++++ ...\274\226\350\276\221\345\231\250 (Vim).md" | 7 + 4 files changed, 266 insertions(+) create mode 100644 "1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.1\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256/\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256.md" create mode 100644 "1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 1 \350\257\276\347\250\213\346\246\202\350\247\210\344\270\216shell.md" create mode 100644 "1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 2 Shell\345\267\245\345\205\267\345\222\214\350\204\232\346\234\254.md" create mode 100644 "1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 3 \347\274\226\350\276\221\345\231\250 (Vim).md" diff --git "a/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.1\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256/\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256.md" "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.1\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256/\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256.md" new file mode 100644 index 0000000..a5872ba --- /dev/null +++ "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.1\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256/\345\246\202\344\275\225\347\247\221\345\255\246\345\234\260\346\217\220\351\227\256.md" @@ -0,0 +1,17 @@ +在阅读《提问的智慧》和《别像弱智一样提问》后,我对“好的提问”和“独立解决问题”有了新的感悟。 + +在大学以前,经常像《提问的智慧》中的反面例子一样提问。很多触手可及的答案都会提问:在刚开始学习装机的时候,如何插电源,内存条插那些插槽。现在看来,这些问题只需要看一下自带的说明书或者百度一下就能解决问题。与此对应的,也被问过一些比较“简单”的问题。像是桌面卡住了,如何查看配置,如何安装某某软件之类的。大多数的提问和回答都是没有必要的。 + +在我看来,在提出好的提问之前,先翻阅手册的faq ,若是得不到解决,再通过互联网搜索是否有相似的问题被解决,要是身边有相关方面的朋友,同学,也可以向他们求助。以上都不能解决问题之后,再在网上提问。我的想法是,每个人的时间都是独立的,而我提问的时候,能回答问题的人不一定在线,就算在线也不一定能看到我的问题。解决问题的效率很低下。最好是能自己独立解决,之后是求助线下的朋友,最次是网上提问。 + +因为本身网上提问效率就已经低下了,所以需要在提问方式上尽可能的高效,不拖后腿。这就需要好的提问。 + +好的提问,首先要将问题表达清楚。表达清楚的意思是,将什么环境,做了什么事情,因此发生了什么,而我又想达到什么目的完整的表达出来。其次,也要加入自己的思考和附上为此做过的努力,比如搜索了相关论坛,查阅了相关的手册,分析得出可能是某方面出问题了,在此基础上尝试解决问题无果。再者,必要的礼仪也是需要的,毕竟是找人求助,此刻就是装孙子的感觉。 + +然后,将问题发到和其领域相关的论坛或者提问页面上。最后,隔一段时间关注它时候被回答,不管是否被回答,都更新一下问题的后续。有始有终,对于问题的解决和其他遇到相同问题的人都很有帮助。 + +在提问前,肯定是先尝试自己独立解决问题的,比如STFW和RTFM。 + +我个人比较喜欢独立解决问题。因为虽然被问题困扰让人心烦,但是让人心烦的程度越高,独自解决后的成就感越大。“太阳底下没有新鲜事”,我认为这句话对大多数问题都一样。一般情况下我喜欢搜索网页来寻找答案,因为这真的很便捷,并且很多问题都是重复的,解决方法也很简单。当然,如果是一些计算机科学相关的问题,阅读手册也能解决很多问题。 + +大多数时间,搜网页和读手册能解决百分之八十的问题,问同学也能解决百分之十五的问题,只有百分之五才需要上网提问。 \ No newline at end of file diff --git "a/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 1 \350\257\276\347\250\213\346\246\202\350\247\210\344\270\216shell.md" "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 1 \350\257\276\347\250\213\346\246\202\350\247\210\344\270\216shell.md" new file mode 100644 index 0000000..2d9b975 --- /dev/null +++ "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 1 \350\257\276\347\250\213\346\246\202\350\247\210\344\270\216shell.md" @@ -0,0 +1,115 @@ +# 1 +使用`echo $SHELL`命令可以查看您的 shell 是否满足要求。如果打印结果为`/bin/bash`或`/usr/bin/zsh`则是可以的。 + +``` +$ echo $SHELL +/bin/bash +``` + +# 2 +在 `/tmp` 下新建一个名为 `missing` 的文件夹。 +``` +$ cd /tmp +$ mkdir missing +``` + +# 3 +用 `man` 查看程序 `touch` 的使用手册。 +``` +$ man touch +``` + +# 4 +用 `touch` 在 `missing` 文件夹中新建一个叫 `semester` 的文件。 +``` +$ cd ./missing/ +$ touch semester +``` + +# 5 +将以下内容一行一行地写入 `semester` 文件: + +``` + #!/bin/sh + curl --head --silent https://missing.csail.mit.edu +``` + +第一行可能有点棘手, `#` 在Bash中表示注释,而 `!` 即使被双引号(`"`)包裹也具有特殊的含义。 单引号(`'`)则不一样,此处利用这一点解决输入问题。 + +``` +$ vim semester +##写入制定内容 +``` + ``` + #!/bin/sh + curl --head --silent https://missing.csail.mit.edu + + + ##请求头信息并且静默模式 + +``` +# 6 +尝试执行这个文件。例如,将该脚本的路径(`./semester`)输入到您的shell中并回车。如果程序无法执行,请使用 `ls` 命令来获取信息并理解其不能执行的原因。 +``` +$ ./semester +bash: ./semester: Permission denied +$ ls -l semester +-rw-rw-r-- 1 yeximing yeximing 63 Oct 4 21:18 semester + +``` + +# 7 +查看 `chmod` 的手册(例如,使用 `man chmod` 命令) +``` +$ man chod +``` + +# 8 +使用 `chmod` 命令改变权限,使 `./semester` 能够成功执行,不要使用 `sh semester` 来执行该程序。您的 shell 是如何知晓这个文件需要使用 `sh` 来解析呢? +``` +$ chmod 764 semester +$ ls -l +total 4 +-rwxrw-r-- 1 yeximing yeximing 63 Oct 4 21:18 semester +$ ./semester +HTTP/1.1 200 Connection established + +HTTP/2 200 +server: GitHub.com +content-type: text/html; charset=utf-8 +last-modified: Tue, 03 Oct 2023 13:58:35 GMT +access-control-allow-origin: * +etag: "651c1e0b-1fce" +expires: Wed, 04 Oct 2023 13:34:50 GMT +cache-control: max-age=600 +x-proxy-cache: MISS +x-github-request-id: B7B4:3A5B:459AE:57B7D:651D67A2 +accept-ranges: bytes +date: Wed, 04 Oct 2023 13:24:50 GMT +via: 1.1 varnish +age: 0 +x-served-by: cache-sjc1000096-SJC +x-cache: MISS +x-cache-hits: 0 +x-timer: S1696425891.831371,VS0,VE103 +vary: Accept-Encoding +x-fastly-request-id: eae1ff0755eb1f190750fa536df3c14ff677d204 +content-length: 8142 + + +``` +# 9 +使用 `|` 和 `>` ,将 `semester` 文件输出的最后更改日期信息,写入主目录下的 `last-modified.txt` 的文件中 +``` +yeximing@yeximing-laptop:/tmp/missing$ ./semester |grep 'last-modified' > last-modified.txt +yeximing@yeximing-laptop:/tmp/missing$ cat last-modified.txt +last-modified: Tue, 03 Oct 2023 13:58:35 GMT +``` + +# 10 +写一段命令来从 `/sys` 中获取笔记本的电量信息,或者台式机 CPU 的温度。 +``` +yeximing@yeximing-laptop:/sys/class/power_supply/BAT0$ cat /sys/class/power_supply/BAT0/capacity +100 + +``` \ No newline at end of file diff --git "a/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 2 Shell\345\267\245\345\205\267\345\222\214\350\204\232\346\234\254.md" "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 2 Shell\345\267\245\345\205\267\345\222\214\350\204\232\346\234\254.md" new file mode 100644 index 0000000..f80f8f7 --- /dev/null +++ "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 2 Shell\345\267\245\345\205\267\345\222\214\350\204\232\346\234\254.md" @@ -0,0 +1,127 @@ +# 1 +- 阅读 man ls,然后使用`ls` 命令进行如下操作: + + - 所有文件(包括隐藏文件) + - 文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954) + - 文件以最近访问顺序排序 + - 以彩色文本显示输出结果 + + 典型输出如下: + + ``` + -rw-r--r-- 1 user group 1.1M Jan 14 09:53 baz + drwxr-xr-x 5 user group 160 Jan 14 09:53 . + -rw-r--r-- 1 user group 514 Jan 14 06:42 bar + -rw-r--r-- 1 user group 106M Jan 13 12:12 foo + drwx------+ 47 user group 1.5K Jan 12 18:08 .. + ``` + +解答: +``` +yeximing@yeximing-laptop:/tmp/missing$ ls -alth --color=yes +total 20K +drwxrwxr-x 2 yeximing yeximing 4.0K Oct 4 23:27 . +-rwxrw-r-- 1 yeximing yeximing 2.0K Oct 4 23:27 tms +drwxrwxrwt 23 root root 4.0K Oct 4 22:47 .. +-rw-rw-r-- 1 yeximing yeximing 46 Oct 4 22:19 last-modified.txt +-rwxrw-r-- 1 yeximing yeximing 63 Oct 4 21:18 semester + +``` + +# 2 +编写两个bash函数 `marco` 和 `polo` 执行下面的操作。 每当你执行 `marco` 时,当前的工作目录应当以某种形式保存,当执行 `polo` 时,无论现在处在什么目录下,都应当 `cd` 回到当时执行 `marco` 的目录。 为了方便debug,你可以把代码写在单独的文件 `marco.sh` 中,并通过 `source marco.sh`命令,(重新)加载函数。 + +解答: +``` + 1 #!/bin/bash + 2 marco(){ + 3 echo "$(pwd)" > $HOME/savelocation + 4 echo "perfome sucessfully" + 5 } + 6 polo(){ + 7 cd "$(cat "$HOME/savelocation")" + 8 } + +``` + +``` +yeximing@yeximing-laptop:/tmp/missing$ vim marco.sh +yeximing@yeximing-laptop:/tmp/missing$ source marco.sh +yeximing@yeximing-laptop:/tmp/missing$ marco +perfome sucessfully +yeximing@yeximing-laptop:/tmp/missing$ cd +yeximing@yeximing-laptop:~$ polo +yeximing@yeximing-laptop:/tmp/missing$ +``` + +# 3 +- 假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段bash脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。 加分项:报告脚本在失败前共运行了多少次。 + + ``` + #!/usr/bin/env bash + + n=$(( RANDOM % 100 )) + + if [[ n -eq 42 ]]; then + echo "Something went wrong" + >&2 echo "The error was using magic numbers" + exit 1 + fi + + echo "Everything went according to plan" + ``` +解答: +``` + 1 #!/bin/bash + 2 + 3 counts=0 + 4 ./testerr &>> ctrlscp + 5 + 6 while true + 7 do + 8 ./testerr &>> ctrlscp + 9 if [ $? -ne 0 ] + 10 then + 11 echo "script was performed $counts before failed" + 12 break + 13 fi + 14 ((counts++)) + 15 done +``` + +# 4 +您的任务是编写一个命令,它可以递归地查找文件夹中所有的HTML文件,并将它们压缩成zip文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行(提示:查看 `xargs`的参数`-d`) + +解答: +``` +yeximing@yeximing-laptop:~/test$ find . -name "*.html" | xargs -d"\n" tar cvf html.zip +``` + +# 5 +(进阶)编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗? + +``` +yeximing@yeximing-laptop:~/test$ find . -type f -print0 | xargs -0 ls -lt | head -10 +-rw-rw-r-- 1 yeximing yeximing 0 Oct 12 22:50 ./newst +-rw-rw-r-- 1 yeximing yeximing 20480 Oct 9 23:59 ./html.zip +-rw-rw-r-- 1 yeximing yeximing 0 Oct 9 23:49 ./new/new.html +-rw-rw-r-- 1 yeximing yeximing 10240 Oct 9 23:43 ./pp.html +-rw-rw-r-- 1 yeximing yeximing 0 Oct 9 23:30 ./i i.html +-rw-rw-r-- 1 yeximing yeximing 0 Oct 9 23:20 ./u u.html +-rw-rw-r-- 1 yeximing yeximing 0 Oct 9 23:18 ./ww.html +-rw-rw-r-- 1 yeximing yeximing 0 Oct 9 23:17 ./tt.html + + + +yeximing@yeximing-laptop:~/test$ find . -type f -mmin -60 -print0 | xargs -0 ls -lt | head -10 +-rw-rw-r-- 1 yeximing yeximing 0 Oct 12 22:50 ./newst + +``` + +``` +-mmin 匹配最近修改时间(分钟),—60,六十分钟前 + +print0 以空格分隔输出 + +xargs -0 同上 +``` \ No newline at end of file diff --git "a/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 3 \347\274\226\350\276\221\345\231\250 (Vim).md" "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 3 \347\274\226\350\276\221\345\231\250 (Vim).md" new file mode 100644 index 0000000..9498e36 --- /dev/null +++ "b/1.\351\242\204\345\255\246\344\271\240\351\230\266\346\256\265/1.2Linux\347\263\273\347\273\237\345\256\211\350\243\205\345\222\214\345\237\272\346\234\254\344\275\277\347\224\250/The Missing Semester of CS Education/- 3 \347\274\226\350\276\221\345\231\250 (Vim).md" @@ -0,0 +1,7 @@ +(高阶)用 Vim 宏将 XML 转换到 JSON 。 尝试着先完全自己做,但是在你卡住的时候可以查看上面宏 章节。 + +修改前: +![[example-data.xml]] + +修改后: +![[example-data.json]] \ No newline at end of file