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"