tools

MIT Missing Semester in CS Education : Shell Notes

Posted on 2021-02-27,3 min read

shell and useful tools

找shell命令的历史记录 ctrl-r 快捷键

字符串:
'' :原义字符串
“” :转义

foo=bar
echo '$foo'  # $foo
echo "$foo"  # bar

练习:假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段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"

solution

# !/bin/bash
#$0 - 脚本名
#$1 到 $9 - 脚本的参数。 $1 是第一个参数,依此类推。
#$@ - 所有参数
#$# - 参数个数
#$? - 前一个命令的返回值; 0 代表正常返回,其他非0返回表示有错误发生
#$$ - 当前脚本的进程识别码
#!! - 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 su    do !!再尝试一次。
file="failure.sh"

./$file 1>>run.log 2>>error.log
# 1代表stdout 重定向到run.log

while [[ $? -eq 0 ]]; do
     ./$file 1>>run.log 2>>error.log
done

echo "$0 finished"

sshfd可以将远端服务器的一个文件夹挂载到本地,然后使用本地的编辑器了。

练习:
如果您希望某个进程结束后再开始另外一个进程, 应该如何实现呢?在这个练习中,我们使用 sleep 60 & 作为先执行的程序。一种方法是使用 wait 命令。尝试启动这个休眠命令,然后待其结束后再执行 ls 命令。
但是,如果我们在不同的 bash 会话中进行操作,则上述方法就不起作用了。因为 wait 只能对子进程起作用。之前我们没有提过的一个特性是,kill 命令成功退出时其状态码为 0 ,其他状态则是非0。kill -0 则不会发送信号,但是会在进程不存在时返回一个不为0的状态码。请编写一个 bash 函数 pidwait ,它接受一个 pid 作为输入参数,然后一直等待直到该进程结束。您需要使用 sleep 来避免浪费 CPU 性能。

#!/bin/bash
com="kill -0 $1"
echo $com
$com
while [[ $? -eq 0 ]]; do
	echo "$1 is still running"
	sleep 60
done
echo "$1 doesn't exist"


下一篇: 前端 Vue-cli4.x项目执行顺序→