我想了解重定向输出。
我有代码:
#!/bin/bash
function function1 () {
log=${1}.log
exec 3>&1
exec 1>>$log
exec 2>&1
echo checking $log >&3
echo txt to $log
}
function1 log1
function1 log2
exit 0
我得到的输出是:
checking log1.log
和文件log1.log
包含内容
txt to log1.log
checking log2.log
和文件log2.log
包含内容
txt to log2.log
我真正想要的是文件log1.log
的内容
txt to log1.log
和文件log2.log
包含内容
txt to log2.log
并输出到终端。
checking log1.log
checking log2.log
我该怎么办呢?
我知道我可以使用function1 log1 > log1.log 2>&1
,但是我无法将echo重定向到function1中的终端,我可以,但结果类似。
答案 0 :(得分:1)
这应该这样做
#!/bin/bash
function function1 () {
log=${1}.log
echo checking $log
echo txt to $log >$log
}
function1 log1
function1 log2
exit 0
当您仅使用更改过的目标一次时,没有理由将更改存储到任何特定的文件描述符。
如果您确实想使用这种方法,比如因为您重定向了很多命令,那么您至少有两个选项:
&3
中),然后在调用后将其恢复。答案 1 :(得分:1)
不知道你为什么要这样做,另一个答案是一个更好的方法,除非你没有透露所有信息,但问题在于你对文件描述符的工作原理的理解。
第一次
exec 3>&1 ## Assign 3 to where 1 is currently pointing which is /dev/tty
exec 1>>$log ## assigns 1 to point to logfile
exec 2>&1 ## Assigns stderr to the 1 which currently points at the logfile
第二次
exec 3>&1 ## Assign 3 to where 1 is currently pointing which is the old logfile
exec 1>>$log ## assigns 1 to point to new logfile
exec 2>&1 ## Assigns stderr to the 1 which currently points at the new logfile
正如您所看到的那样,文件描述符会记住它们指向的位置并简单地指向您告诉它们的任何内容。
如果你想这样做,而不是重定向到1,只需直接重定向到/ dev / tty,不像1,这将永远不会改变(希望!)。
#!/bin/bash
function function1 () {
log=${1}.log
exec 3>/dev/tty
exec 1>>$log
exec 2>&1
echo checking $log >&3
echo txt to $log
exec 1>/dev/tty # Probably want this line as well so your not writing to
# the logfile for the rest of the script
}
function1 log1
function1 log2
exit 0