Bash:如何在命令上调用或修改变量的内容?

问题描述

关于这个问题here的可接受答案(将STDOUT重定向到新窗口,将STDERR重定向到相同的新窗口,并且还一个日志文件),我有一个使用此脚本的bash脚本诸如此类的输出处理很多(感谢@ hek2mgl!)。不是在所有命令上,而是在需要更改输出的命令上。例如,要将测试消息发送到新窗口和日志文件以及相应的错误处理,效果很好(同样,如另一线程所讨论):

printf "Test.\n" 1> >(tee -a backup_log-task${currentTask}.txt >> /dev/pts/$windowID) 2> >(tee -a backup_log-task${currentTask}.txt backup_log-task${currentTask}-errors.txt >> /dev/pts/$windowID)

但是。与其复制/粘贴该行以在bash脚本中所需的位置反复处理输出,没有一种方法可以将所需的输出设置为变量,然后在需要的地方将其调用到某些命令上? >

因此,为说明起见,将所需的输出设置放入:$outputHandling,如下所示:

$outputHandling="1> >(tee -a backup_log-task${currentTask}.txt >> /dev/pts/$windowID) 2> >(tee -a backup_log-task${currentTask}.txt backup_log-task${currentTask}-errors.txt >> /dev/pts/$windowID)"

但是如何通过命令调用/修改呢?

这非常接近我用极其有限的知识(例如,不起作用,因为它正在打印变量)非常刻薄地尝试替换之后,但是希望显示出我正在尝试做什么?

#!/bin/bash

currentTask=1
windowID=0

outputHandling="1> >(tee -a backup_log-task${currentTask}.txt >> /dev/pts/$windowID) 2> >(tee -a backup_log-task${currentTask}.txt backup_log-task${currentTask}-errors.txt >> /dev/pts/$windowID)"

# we want to run: printf "Test.\n" 1> >(tee -a backup_log-task${currentTask}.txt >> /dev/pts/$windowID) 2> >(tee -a backup_log-task${currentTask}.txt backup_log-task${currentTask}-errors.txt >> /dev/pts/$windowID)
printf "Test.\n" ${outputHandling}

PS致歉,反对/业余爱好!

解决方法

我认为您正在寻找的是内置eval的shell:

$ eval --help
eval: eval [arg ...]
    Execute arguments as a shell command.
    
    Combine ARGs into a single string,use the result as input to the shell,and execute the resulting commands.
    
    Exit Status:
    Returns exit status of command or success if command is null.

尝试将eval命令放在要获得问题描述效果的行的开头:

#!/bin/bash

currentTask=1
windowID=1

outputHandling="1> >(tee -a backup_log-task${currentTask}.txt >> /dev/pts/$windowID) 2> >(tee -a backup_log-task${currentTask}.txt backup_log-task${currentTask}-errors.txt >> /dev/pts/$windowID)"

# we want to run: printf "Test.\n" 1> >(tee -a backup_log-task${currentTask}.txt >> /dev/pts/$windowID) 2> >(tee -a backup_log-task${currentTask}.txt backup_log-task${currentTask}-errors.txt >> /dev/pts/$windowID)
eval printf "Test.\\n" ${outputHandling}