Bash:如何在变量中存储STDOUT(& 1)指针

时间:2014-07-21 17:49:26

标签: bash stdout io-redirection

在一个简单的问题场景中,这是一个简单的(也许是虚拟的)问题。

我想将输出文件存储在变量中:

#!/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

3 个答案:

答案 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