shell形参延迟解析/替换

要顺序执行多条命令,但希望每次执行之前都做些额外的辅助操作:

  • 将执行历史写进一个 txt 文件,用来查进度;
  • 每次执行之前,用 [1] 重新找一次 GPU 列表(因为多人用,要动态刷新顺序);
  • 如果某命令执行失败,写入另一个 txt 文件,用来定位 bug。

示例如下:

#!/bin/bash

run()
{
	# 记录执行历史
    echo $(date) >> RUNNING.txt
    eval echo $1 >> RUNNING.txt
    # 重寻 GPU 列表
    . find_gpu.sh -1 8000
    # 执行传入的命令
    # 此处用 `eval` 延迟解析/替换 `$1` 中的「形参」`${gpu_id}`
    eval $1
    if [ $? -ne 0 ]; then
    	# 若出错,记录出错命令
        echo $(date) > FAILED.txt
        eval echo $1 >> FAILED.txt
        # 并中止
        exit
    fi
}

# 删旧报错、执行历史
if [ -e FAILED.txt ]; then rm FAILED.txt; fi
if [ -e RUNNING.txt ]; then rm RUNNING.txt; fi

# 顺序执行多条命令
# 其中 `-g ${gpu_id}` 指定使用的 GPU(列表)
# 注意,用单引号「'」,而不是双引号「"」
# 因为用双引号的话,`${gpu_id}` 会被**立即**替换
# 而我希望它在 `run` 中重寻 GPU 列表之后再替换(即延时替换)
# 我将此处未被替换的 `${gpu_id}` 称为「形参」
run 'python program1.py -g ${gpu_id}'
run 'python program2.py -g ${gpu_id}'
run 'python program3.py -g ${gpu_id}'

其中,run 后面的参数是要执行的命令,而 run 函数中加了一些辅助命令(详见注释)。此处主要指出引号「'」和 eval 命令的配合使用:

  • run 的参数用引号「'」括住,于是里面的 ${gpu_id} 会立即被替换(如果用引号「"」就会被立即替换)。我将这个被替换的 ${gpu_id} 称为形参;
  • run 内先用 . find_gpu.sh 重寻 GPU 列表,此命令会对变量 gpu_id 赋值(详见 [1]);
  • 然后,再用 eval 替换 $1 中的形参 ${gpu_id} 并执行,即其替换时机被延迟了。

References

  1. shell监视gpu使用情况
  2. linux shell中的eval
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值