변수(특정 조건 등에 따라 설정할 수 있음)를 통해 리디렉션 명령/옵션을 지정할 수 있기를 원합니다. 하지만 이 bash 스크립트를 실행하면 다음과 같습니다.
REDIRECT=">>test"
exec echo hi ${REDIRECT}
나는 다음을 얻습니다 ( bash -x 를 통해 출력):
+ REDIRECT='>>test'
+ exec echo hi '>>test'
hi >>test
exec가 REDIRECT 변수의 값을 문자 그대로 바꾸는 대신 작은따옴표 안에 넣는 것처럼 보입니다.
이 문제를 어떻게 해결/해결할 수 있나요?
답변1
사용을 피하려면 다음을 수행하십시오 eval
.
opt_file=""
# Command line parsing bit here, setting opt_file to a
# file name given by the user, or leaving it empty.
if [[ -z "$opt_file" ]]; then
outfile="/dev/stdout"
else
outfile="$opt_file"
fi
exec echo hi >>"$outfile"
동일한 작업을 수행하는 약간 더 짧은 변형입니다.
# (code that sets $opt_out to a filename, or not,
# and then...)
outfile=${opt_file:-/dev/stdout}
exec echo hi >>"$outfile"
답변2
나는 이것을 할 수 있는 유일한 방법은 eval
다음과 같은 것을 사용하는 것이라고 생각합니다.고전적인 경고약 eval
. 즉, 다음과 같이 할 수 있습니다.
REDIRECT=">>test"
eval echo hi ${REDIRECT}
답변3
예를 들어 다음 명령을 사용하여 전체 파일을 stdout
파일로 리디렉션할 수 있습니다.exec
exec >> outfile
이제 모든 출력이 로 전송됩니다 outfile
.
예를 들어:
#!/bin/bash
exec >> outfile
echo start
echo hello
echo there
echo end
이것을 실행하면:
$ ./x
$ cat outfile
start
hello
there
end
$ ./x
$ cat outfile
start
hello
there
end
start
hello
there
end
따라서 우리는 모든 실행이 추가되는 것을 볼 수 있습니다.
테스트에 추가하는 것이 쉬워집니다.
if [ -n "$REDIRECT" ]
then
exec >> $REDIRECT
fi