당신이 실행 스크립트, 쉘이 stderr에 파일 기술자 (3)을 첨부합니다.
그러나 스크립트 내에서 , 그것은 기본적으로 스크립트를 실행할 때 무슨 짓을 무시 비트 버킷에 파일 기술자 3 개 데이터를 전송하는 exec
를 사용합니다.
이 문제를 해결하는 방법 중 하나는 스크립트를 시작할 때 리디렉션을 수행하지 않는 것입니다.
fd3file=/dev/null
if [[ "$1" != "" ]] ; then
fd3file="$1"
fi
exec 3>${fd3file}
그것은 매개 변수를 사용할 필요가 없습니다, 당신은 을 사용할 수 스크립트가 전체 제어 할 수있는 다음
./MyScript # with no parameter
./MyScript /tmp/xyzzy # with a parameter
을하고 대신 사용하고자하는 파일을 선택 매개 변수를 전달 환경 변수, 구성 파일 항목 등과 같은 정보 소스를에 저장하십시오. 그러나 기본 전제는 스크립트가 결정을 내리도록합니다.
다음 스크립트는 실제로이를 보여줍니다. fd 3
을 fd 4
에 복제하려고 시도하고 오류를 감지합니다. 실패는 fd 3
이 열려 있지 않았으므로 /dev/null
에 연결합니다.
#!/bin/bash
# Try and duplicate fd 3 (without ugly error message)
(exec 4>&3) 2>/dev/null
# Figure out whether fd3 was open.
if [[ $? -eq 1 ]] ; then
# It was not open so we need redirect.
echo 'redirect failed, need to exec 3>/dev/null'
exec 3>/dev/null
else
# It was, open so we leave fd3 alone (and close fd4 duplicate).
echo 'redirect worked, leave fd3 alone'
exec 4>-
fi
echo 'fd3 content' >&3
다음 성적표는 행동을 보여줍니다 성공은 사용자가 이미 무언가에 연결되어 있기 때문에 그래서 우리는 혼자두고가 열려 의미합니다.첫째, 스크립트를 야기 쉘 기반 재 지정이없는 한 후크하는 fd 3
/dev/null
에 : 혼자 fd 3
잎, 그리고 당신이 할 수있는 (qq
에)
pax> ./qq.sh
redirect failed, need to exec 3>/dev/null
pax> cat qq
cat: qq: No such file or directory
다음, 하나 와 쉘 기반 리디렉션 다음 qq
에 리디렉션이 일어난 것을 볼 수 :
pax> ./qq.sh 3>qq
redirect worked, leave fd3 alone
pax> cat qq
fd3 content
내가 정보 함수를 작성하고'은/dev/null'에 이르기까지를 보낼 것이 아니라, 기록 여부를 결정하는 플래그로 변수를 사용합니다. 또한 리디렉션에'exec'을 사용하지 않는 것이 좋습니다. exec가 적용되는 것은 매우 상황에 민감 할 수 있기 때문에 스크립트가 너무 복잡해지면 오류가 발생할 수 있으며, 수동으로 열린 fds를 수동으로 처리해야합니다. – ormaaj