Bash 使用

发布时间: 更新时间: 总字数:610 阅读时间:2m 作者: IP上海 分享 网址

Linux Bash 使用介绍

介绍

各种文件说明

  • /etc/profile 系统环境参数,对系统的所有用户生效
  • /etc/bashrc bash 参数设置,只要用户使用 bash 就生效
  • ~/.bash_profile 功能同 /etc/profile,仅对当前用户生效
    • 仅当用户登录(login)时生效,是交互式
  • ~/.bashrc 功能同 /etc/bashrc,仅对当前用户生效
    • 非交互式的,当以用户身份运行命令时就读取该文件
    • docker exec 时是非交互方式进入 bash,该文件生效

bash 命令的 --rcfile 参数,指定另一个脚本代替 .bashrc

特殊变量

shell 文件的特殊变量:

  • $0 当前脚本的文件名
  • $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数
    • 例如,第一个参数是 $1,第二个参数是 $2
  • $# 传递给脚本或函数的参数个数
  • $* / $@ 传递给脚本或函数的所有参数
  • $? 上个命令的退出状态,或函数的返回值
  • $$ 当前 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"
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数