Linux Bash 使用介绍
介绍
各种文件说明
/etc/profile
系统环境参数,对系统的所有用户生效
/etc/bashrc
bash 参数设置,只要用户使用 bash 就生效
~/.bash_profile
功能同 /etc/profile
,仅对当前用户生效
~/.bashrc
功能同 /etc/bashrc
,仅对当前用户生效
- 非交互式的,当以用户身份运行命令时就读取该文件
- docker exec 时是非交互方式进入 bash,该文件生效
bash 命令的 --rcfile
参数,指定另一个脚本代替 .bashrc
特殊变量
shell 文件的特殊变量:
$0
当前脚本的文件名
$n(n≥1)
传递给脚本或函数的参数。n 是一个数字,表示第几个参数
$#
传递给脚本或函数的参数个数
$*
/ $@
传递给脚本或函数的所有参数
$?
上个命令的退出状态,或函数的返回值
$$
当前 Shell 进程 PID。对于 Shell 脚本,就是这些脚本所在的进程 ID
示例
多线程示例
#!/bin/bash
function my_cmd(){
local ppid=$$
local pid=$BASHPID
local gpu_id=$1
export CUDA_VISIBLE_DEVICES=${gpu_id}
echo "ppid: ${ppid}, pid: ${pid}, gpu_id: ${gpu_id}, begin sleep 10 s"
sleep 10
echo "ppid: ${ppid}, pid: ${pid}, gpu_id: ${gpu_id} sleep 10 s done."
# 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
echo ${gpu_id} >&6
}
tmp_fifofile="/tmp/$$.fifo"
# 新建一个fifo类型的文件
mkfifo $tmp_fifofile
# 将fd6指向fifo类型
exec 6<>$tmp_fifofile
# rm $tmp_fifofile
# 最大可同时执行线程数量
thread_num=5
# 任务总数
job_num=100
# 根据线程总数量设置令牌个数
for ((i=0;i<${thread_num};i++));do
echo ${i}
done >&6
for ((i=0;i<${job_num};i++));do # 任务数量
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
read -u6 gpu_id
#可以把具体的需要执行的命令封装成一个函数
{
my_cmd ${gpu_id}
} &
done
wait
# 关闭fd6
exec 6>&-
echo "over"