在一个简单的问题场景中,这是一个简单的(也许是虚拟的)问题。
我想将输出文件存储在变量中:
#!/bin/bash
LOG=/var/log/myown/backup.log
所以我可以用这种方式构建我的脚本:
#!/bin/bash
LOG=/var/log/myown/backup.log
echo "Backup créé le $(date)" >>$LOG
另外,我想让LOG变量指向 STDOUT 。
然后我可以像LOG
一样更改LOG=&1
的值,因此它不会写入文件,而是写入 STDOUT 。
答案 0 :(得分:8)
这是你需要的吗?
LOG=/dev/stdout
或者也许:
LOG=/var/log/myown/backup.log
exec 4> "$LOG" ## exec >>4 "$LOG" to append
echo "Backup créé le $(date)" >&4
或者最后:
LOG=/var/log/myown/backup.log
exec 4> "$LOG" ## exec >>4 "$LOG" to append
LOG_FD=4 ## Change to 1 to put back to stdout.
echo "Backup créé le $(date)" >&"$LOG_FD"
您还可以使用功能:
function log {
echo "$1" >&"$LOG_FD"
}
log "Backup créé le $(date)"
答案 1 :(得分:1)
在现代(4.1+)版本的bash中,您可以使用扩展来引用文件描述符:
log_fd=1 # hardcode FD 1 as output source
echo "Hello" >&$log_fd # ...and use that value
这对于自动文件描述符分配来说非常方便,也在4.1中添加:
exec {log_fd}>log.txt # open log.txt on an automatically-assigned free FD
# ...and save that FD number in log_fd
echo "Hello" >&$log_fd # write to log.txt on that FD
你不能将&
本身放入变量 - 这实际上是更好的设计;否则,您无法重定向到以文字&
开头的文件名,并且用户可以指定文件名的任何程序都允许用户定位stdout / stderr / etc - 但这不会损失灵活性,因为您可以在其重定向使用模式下使用exec
在任何FD上打开任何文件名。
答案 2 :(得分:0)
听起来你想要tee
LOG=/var/log/myown/backup.log
echo "Backup créé le $(date)" | tee -a $LOG