如何使文件描述符的可读别名

时间:2016-02-06 10:19:50

标签: bash shell

我知道如何制作文件描述符的别名

exec 3>&1  1> /dev/null 
echo "hello world" >&3

但这不可读。有没有办法使它可读(意味着代替>& 3我可以写LOG或INFO或DEBUG)?

3 个答案:

答案 0 :(得分:1)

您只需使用参数来存储要使用的文件描述符。

exec 3>&1 1>/dev/null
LOG=3
echo "hello world" >&$LOG

您不能将>&部分存储在参数中,因为这是shell语法,而不是数据。但是,您可以编写一个函数,将其参数输出到特定的文件描述符。

LOG () {
    echo "$@" >&3
}
LOG "hello world"

答案 1 :(得分:0)

如果你写&1,你可以参考标准输出,它用于输出。您还使用>进行重定向,用于输出。

如果您关心输入,您可以通过引用&0来使用标准输入。在这种情况下,您还应该使用<作为输入。

例如:

exec 3<&0

有关更多信息,请键入man bash并查找有关重定向的部分。

答案 2 :(得分:0)

我不明白为什么你想要fd 3。 在我的解决方案中,我展示了如何混合fd1和fd3:

function opendebug {
   exec 3>&1 1> /dev/null
}

function mylog {
   level=$1
   shift
   printf "(fd 1) %s: %s\n" "${level}" "$*"
   printf "(fd 3) %s: %s\n" "${level}" "$*" >&3
}

function logerror {
   if [ ${loglevel} -ge 1 ]; then
      mylog "ERROR" "$*"
   fi
}

function loginfo {
   if [ ${loglevel} -ge 3 ]; then
      mylog "INFO" "$*"
   fi
}

function logdebug {
   if [ ${loglevel} -ge 5 ]; then
      mylog "DEBUG" "$*"
   fi
}

export loglevel=3

logerror "Line with error"
loginfo  "Line with info"
logdebug "Line with debug" # will be suppressed

echo Open debug
opendebug
logerror "Line with error"
loginfo  "Line with info"
logdebug "Line with debug" # will be suppressed

输出:

(fd 1) ERROR: Line with error
(fd 1) INFO: Line with info
Open debug
(fd 3) ERROR: Line with error
(fd 3) INFO: Line with info