Globbing模式在脚本中正常但经at命令调度后失效的问题
问题解决:at命令调度Bash脚本时大括号扩展失效
问题现象
编写的Bash脚本直接运行时能正常批量创建100个文件,但通过at命令调度执行后,仅生成一个名为file{1..100}.txt的文件。
脚本代码:
#!/bin/bash mkdir folder1 touch folder1/file{1..100}.txt
调度执行后的输出:
stevis@stevis:~/Desktop/Linux/bash/scheduling$ ls folder1/ file{1..100}.txt
问题原因
at命令默认使用系统的sh shell执行任务,而sh不支持Bash特有的大括号序列扩展({1..N})语法,因此会把整个file{1..100}.txt当作单个文件名处理,而非展开为100个不同的文件名。
解决方案
方案1:提交at任务时指定用Bash执行脚本
提交任务时明确指定调用bash运行脚本,替代at默认的sh:
# 方法1:通过管道传递命令给at echo "bash /home/stevis/Desktop/Linux/bash/scheduling/your_script.sh" | at now +1min # 方法2:进入at交互模式后输入命令 at now +1min # 输入以下内容后按Ctrl+D结束 bash /home/stevis/Desktop/Linux/bash/scheduling/your_script.sh
方案2:修改脚本兼容POSIX shell(sh)
如果希望脚本在sh环境下也能正常工作,将大括号扩展替换为for循环+seq命令的方式:
#!/bin/bash mkdir folder1 # 用循环替代大括号扩展,兼容sh for i in $(seq 1 100); do touch folder1/file${i}.txt done
这样无论直接运行还是通过at调度,都能正确生成100个文件。
内容的提问来源于stack exchange,提问作者Sstevis
相关产品推荐
相关产品推荐

