bash에서 조건부로 출력을 stdout 또는 /dev/null로 리디렉션할 수 있습니까?

bash에서 조건부로 출력을 stdout 또는 /dev/null로 리디렉션할 수 있습니까?

예:

저는 이 스크립트를 테스트 실행으로 받아들이고 --simulate실행하는 대신 명령을 인쇄하는 스크립트를 작성 중입니다. 정상적으로 실행될 때(즉, 사용 중이 아닌 경우 --simulate) 실행 중인 명령은 콘솔에 많은 출력을 생성하는데, 이를 숨길 수 있기를 바랍니다.

현재의

나는 현재 이것과 비슷한(약간 단순화된) 작업을 하고 있으며 Windows 게임과 관련된 독점 아카이브 형식의 여러 압축 파일을 통해 루프를 실행하고 있습니다.

# flag variable
mode='';
if [[ "--simulate" == "$1" ]]; then
    mode="echo";
fi

# command is a long wine command that takes a mess of arguments
# and generates a LOT of output
${mode} command

나 어디 붙어있어?

${mode} command콘솔 소음을 피하기 위해 to를 변경하려고 생각했을 때 이것이 ${mode} command 2>&1 >/dev/nullto에서 출력을 보내는 효과도 있다는 것을 깨달았습니다.echo--simulate/dev/null

한 가지 옵션은 IF 블록을 사용 test하고 명령문의 여러 복사본을 유지하는 것이라는 것을 알고 있지만 더 좋은 방법이 있는지 궁금합니다.

다음과 같은 작업을 수행할 수 있는 방법이 있을 것이라고 생각했지만 Google/여기에서 찾을 수 없으므로 혹시 모르니 물어보겠습니다.

# flag variable
mode='';
redirectOutputTo='/dev/null';
if [[ "--simulate" == "$1" ]]; then
    mode="echo";
    redirectOutputTo="stdout";
fi

# If this is run as is, it will just create a file named 'stdout' in the script folder
# bc I assume that is not the real name. Ditto for using '&1'; just creates a file.
${mode} command 2>&1 >${redirectOutputTo}

배쉬/OS 버전

차이가 있다면 내 시스템이 실행되는 환경은 다음과 같습니다(Mint 19.3 x64).

$ bash --version|head -1
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

$ uname -vo
#56~18.04.1-Ubuntu SMP Wed Jun 24 16:17:03 UTC 2020 GNU/Linux

답변1

쉘 함수를 사용하십시오:

runmaybe () {
  if [[ $mode == "--simulate" ]]
  then echo $@
  else $@ 2>&1 > /dev/null
  fi
}

개념 증명은 다음과 같습니다.

#!/bin/bash

filethatwillsavestderr="/tmp/foo"
filethatwillsavestdout="/tmp/bar"

mode="--simulate" #switch this to another mode to see the effect

runmaybe () {
  if [[ $mode == "--simulate" ]]
  then echo "I should run '$@' but i'm not really doing it"
  else $@ > $filethatwillsavestdout 2> $filethatwillsavestderr
  fi
}

runmaybe ls

관련 정보