인수가 제공되면 파일로 출력하고, 그렇지 않으면 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현재 스크립트의 표준 출력을 다른 파일로 리디렉션하는 데 사용할 수 있습니다.

[ -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}

관련 정보