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