Exec 명령의 변수를 통해 리디렉션 옵션을 지정합니다.

Exec 명령의 변수를 통해 리디렉션 옵션을 지정합니다.

변수(특정 조건 등에 따라 설정할 수 있음)를 통해 리디렉션 명령/옵션을 지정할 수 있기를 원합니다. 하지만 이 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

관련 정보