使用变量切换 Bash 重定向

Jul*_*cea 5 bash redirect

MUTE='&> /dev/null'
echo "text" $MUTE
Run Code Online (Sandbox Code Playgroud)

有没有办法使该工作保持变量内的重定向?

ste*_*ver 5

恕我直言,使用变量的存在/值来有条件地关闭文件描述符会更优雅,例如

$ cat myscript.sh
#!/bin/bash

if [ -n "$MUTE" ]; then
    exec &>-
fi

echo somestuff
echo someerr >&2
Run Code Online (Sandbox Code Playgroud)

然后

$ ./myscript.sh
somestuff
someerr
Run Code Online (Sandbox Code Playgroud)

$ MUTE=yes ./myscript.sh
$
Run Code Online (Sandbox Code Playgroud)

如果你真的想切换重定向,你可以考虑创建一个 shell 函数,在关闭它们之前复制文件描述符,然后恢复重复项以重新启用原始流,例如

#!/bin/bash

function mute {
  case "$1" in
    "on") 
      exec 3>&1-
      exec 4>&2-
    ;;
    "off") 
      exec 1>&3-
      exec 2>&4-
    ;;
    *)
  esac
}


# Demonstration: 

echo "with mute on: "
mute on
ls somefile
ls nofile

mute off
echo "with mute off: "
ls somefile
ls nofile
Run Code Online (Sandbox Code Playgroud)

结果:

$ ./mute.sh
with mute on: 
with mute off: 
somefile
ls: cannot access nofile: No such file or directory
Run Code Online (Sandbox Code Playgroud)