英文:
Updating variables in the watch command in bash
问题
我有一系列以序列命名的目录(即001 002 003 ... 999)。我正在运行一个作用于每个目录中内容的作业,按照从001到999的顺序升序执行。作业会将结果回显到每个目录中的output.txt文件中。当作业完成处理目录中的内容时,它会将"running DIRECTORY_NAME"回显到父目录中的job_status.txt文件,并继续处理下一个目录。
我想运行一个简单的命令,查看作业当前正在运行的目录的output.txt。
我尝试过
watch "i=$(tail -n 1 job_status.txt | awk '{print $2}'); tail $i/output.txt"
这最初是有效的;然而,当作业移动到新目录时,watch命令中的$i未更新,我会继续查看作业已经完成的目录中的output文件。
如何解决这个问题?
非常感谢
Jacek
英文:
I have a series of directories with names in a sequence (i.e. 001 002 003 ... 999). I am running a job that works on the contents in each directory, ascending the sequence from 001 to 999. The job will echo into an output.txt file in each directory. When the job has finished working on the content in a directory, it echoes "running DIRECTORY_NAME" to the job_status.txt file in the parent directory and moves on to work on the next directory.
I would like to run a simple command that looks at the output.txt of the directory that the job is currently running in.
I tried
watch "i=$(tail -n 1 job_status.txt | awk '{print $2}'); tail $i/output.txt"
This works initially; however, when the job moves on to a new directory, $i in the watch command is not updated and I'm stuck looking at the output file from the directory that the job has already completed.
How can I solve this issue?
Many thanks
Jacek
答案1
得分: 3
你在watch
执行之前甚至扩展了变量。请改用单引号代替:
watch 'i=$(awk "END { print $2 }" job_status.txt); tail "$i/output.txt"'
当执行该命令时,watch
调用sh -c
,因此定义命令时要像使用sh
一样调用它。
英文:
You're expanding the variable even before watch executes. Use a single quote instead:
watch 'i=$(awk "END { print \$2 }" job_status.txt); tail "$i/output.txt"'
Watch calls sh -c
when executing the command, so define the command as if you're calling it with sh
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论