인수가 주어지면 파일로 출력하고 그렇지 않으면 stdout으로 출력하는 간결한 방법

인수가 주어지면 파일로 출력하고 그렇지 않으면 stdout으로 출력하는 간결한 방법

파일 이름을 인수로 얻지 않는 한 스크립트를 stdout으로 출력하고 싶습니다. 분명한 방법은 다음과 같습니다:

if [ -e "$1" ]; then
  command_with_output >$1
else
  command_with_output
fi

꽤 추악하고 반복이 있으므로 좀 더 간결한 방법을 원합니다.

다음을 시도했지만 작동하지 않습니다.

[ -e "$1" ] && outfile=$1 || outfile='&1'
command_with_output >$outfile

편집: 답변의 관련성은 변경되지 않지만 파일이 아직 존재하지 않을 수 있기 때문에 touch "$1" && outfile=$1실제로 필요한 것이 아니라 [ -e "$1" ] && outfile=$1파일에 쓰거나 만들 수 있는지 확인하고 싶습니다. 그것은 단지 존재하는 것뿐만이 아닙니다. 답변이 동기화되지 않기 때문에 질문을 변경하지 않습니다.

답변1

exec현재 스크립트의 stdout을 다른 파일로 리디렉션하는 데 사용할 수 있습니다.

[ -e "$1" ] && exec > $1
command_with_output

답변2

$1또 다른 방법은 전달된 경우 파일 이름으로 사용하고, /dev/stdout그렇지 않은 경우(Linux에서는 기호 링크 /proc/self/fd/1이고 다른 많은 Unix 변형에서는 동일한 의미를 갖는 장치 노드)를 사용하는 것입니다 . 예를 들어 스크립트 상단에 다음을 입력하세요.

if [ -e "$1" ]; then
    filename=$1
else
    filename=/dev/stdout
fi

그런 다음 모든 명령의 출력을 다음으로 리디렉션합니다.$filename

답변3

파일 매개변수 외에는 아무것도 사용하지 않는 경우에도 작동합니다.

command_with_output > ${1:-/dev/stdout}

편집: 또는 더 나은 방법은 아마도 오류에도 관심이 있을 것이기 때문입니다.

command_with_output &> ${1:-/dev/stdout}

관련 정보