파일 이름을 인수로 얻지 않는 한 내 스크립트가 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}