【问题标题】:How to redirect stderr to /dev/null?如何将标准错误重定向到 /dev/null?
【发布时间】:2021-03-30 11:14:27
【问题描述】:

我有一个小功能可以让我激活我的 python 虚拟环境,对于不同的 repos,它有时是隐藏的 (.venv) 有时不是 (venv)。我无法抑制标准错误。

这是我的小功能(它位于~/.zshrc

function venv {
    source `ls -a $PWD/*/bin/activate` > /dev/null
    if [[ $? -ne 0 ]] 
    then
        source `ls -a $PWD/.*/bin/activate` 
    fi
}

$PWD/*/bin/activate$PWD/.*/bin/activate 中只有一个存在,我想忽略不存在的那个,没有错误。

问题在于这一行

ls -a $PWD/*/bin/activate 2>&1 /dev/null

给出终端输出

zsh: no matches found: /home/jokea/code/FlorA/*/bin/activate

我的理解是2>&1 /dev/null 应该同时抑制标准错误和标准输出。那么为什么它不起作用呢?

我已经尝试了我能找到的所有其他变体(>>>&>>& 等),但它仍然会打印到终端。如何使我的函数的所有输出静音?

【问题讨论】:

    标签: zsh


    【解决方案1】:

    在我看来,在 zsh 通配符 * 扩展中可能并不总是考虑到 stderr 重定向。

    我常用的更清洁的解决方案是这样的:

    find . -maxdepth 2 -name activate -type f -print |
      grep /bin/ |
      head -1 |
      while read script
      do source "$script"
      done
    

    【讨论】:

      【解决方案2】:

      使用其他答案并没有完全让我到达那里,但根据 davidxxx 和 rowboat 的建议(感谢这些),我把这个破解了:

      function venv {
          setopt +o nomatch
          ls -a $PWD/.*/bin/activate > /dev/null 2>&1
          if [[ $? -eq 0 ]] 
          then
              source `ls -a $PWD/.*/bin/activate` > /dev/null 2>&1 
          else
              ls -a $PWD/*/bin/activate > /dev/null 2>&1
              if [[ $? -eq 0 ]]  
              then   
                 source `ls -a $PWD/*/bin/activate` > /dev/null 2>&1  
              else   
                 echo "There's no Virtual Environment in $PWD"     
              fi
          fi
      }
      

      诚然,这有点垃圾,但它确实有效。我现在可以设置虚拟环境而不会出现任何错误。

      【讨论】:

        【解决方案3】:

        有两件事让我很恼火:

        ls -a $PWD/*/bin/activate 2>&1 /dev/null
        

        重定向的顺序不对(你重定向std输出中的错误)并且/dev/null没有前缀流重定向。

        您应该首先将 std 输出重定向到 /dev/null,然后将 std 错误重定向到与 std 输出相同的流(即 /dev/null):

        ls -a $PWD/*/bin/activate > /dev/null 2>&1
        

        【讨论】:

          猜你喜欢
          • 2020-02-10
          • 2017-11-29
          • 1970-01-01
          • 2012-08-15
          • 2018-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多