Bash中watch命令变量更新问题:实时查看任务当前目录output.txt
问题解决方法
你的问题出在watch命令启动时就提前解析了变量$i,导致后续每次执行watch的命令时,$i都是最初的固定值,不会重新读取job_status.txt获取最新目录。
解决的核心思路是:让目录名的读取操作在watch每次执行周期内都重新运行,而不是只在启动时执行一次。
方案1:修正变量解析时机
把watch的命令用单引号包裹,避免shell提前解析变量,同时调整引号的使用:
watch 'i=$(tail -n 1 job_status.txt | awk '\''{print $2}'\''); tail "$i/output.txt"'
这里用嵌套单引号处理awk的脚本,确保每次watch执行时,都会重新读取job_status.txt的最后一行,提取最新的目录名赋值给i,再读取对应目录的output.txt。
方案2:简化命令(省略变量)
可以直接把目录提取和tail操作合并,更简洁:
watch 'tail $(tail -n 1 job_status.txt | awk '\''{print $2}'\'')/output.txt'
方案3:用xargs实现
如果觉得引号嵌套麻烦,也可以用xargs来传递目录名:
watch 'tail -n 1 job_status.txt | awk '\''{print $2}'\'' | xargs -I {} tail {}/output.txt'
原理说明
原来的命令用双引号包裹,shell会在启动watch前就执行$(tail -n 1 job_status.txt | awk '{print $2}')并把结果赋值给$i,之后watch每次执行的只是固定的tail 初始目录/output.txt。而改用单引号包裹后,整个命令字符串会被完整传递给watch,每次执行时才由shell解析执行,从而每次都能获取最新的目录名。
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

