2013-03-10 5 views
1

왜 작동하지 않습니까?리눅스 파일 설명자 혼동

내가보기에 fd 3을 열어 dev nul로 보냈습니다.

다음 나중에 경로 FD (3) 전략 중 2.

내가 무효로하지만 필요한 경우 기본 파이프 stderr로 라우팅 할 수있는 표준 정보와 같은 내 스크립트에서 FD (3)를 사용하고 달성하기 위해 노력하고 또는 검사 용 파일.

MyScript.bash

exec 3>/dev/null 
echo spo >&3 

이 에코 아무것도는 stderr로 :

./MyScript.bash 3>&2 
+0

내가 정보 함수를 작성하고'은/dev/null'에 이르기까지를 보낼 것이 아니라, 기록 여부를 결정하는 플래그로 변수를 사용합니다. 또한 리디렉션에'exec'을 사용하지 않는 것이 좋습니다. exec가 적용되는 것은 매우 상황에 민감 할 수 있기 때문에 스크립트가 너무 복잡해지면 오류가 발생할 수 있으며, 수동으로 열린 fds를 수동으로 처리해야합니다. – ormaaj

답변

1

당신이 실행 스크립트, 쉘이 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 

을하고 대신 사용하고자하는 파일을 선택 매개 변수를 전달 환경 변수, 구성 파일 항목 등과 같은 정보 소스를에 저장하십시오. 그러나 기본 전제는 스크립트가 결정을 내리도록합니다.

  • 당신이 실제로 열려 있지 않은 출력을위한 파일 기술자를 복제하려고하면은, 그건 :

    지금 당신은 사실을 활용하여 여러 층 (쉘 스크립트 리디렉션)에서이 작업을 수행 _can 리디렉션 오류를 고려했습니다.

  • exec은 리디렉션 오류가 발생하면 리턴 코드 1과 함께 실패합니다.

다음 스크립트는 실제로이를 보여줍니다. fd 3fd 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 
+0

그건 의미가 있습니다! 나는 내가 원하는 것을 성취 할 수 없다고 생각한다! 스크립트에서 fd를 선언하지 않고 파이프로 연결하면 에러가되지만 fd를 선언하면 명령 줄에서 리디렉션이 무시됩니다! – Prospero

+0

@James, 거기에 문제가 _many_ 방법, 나는 하나의 답변을 업데이 트했습니다. – paxdiablo

+0

Bash의 많은 옵션이 특히 그렇습니다. 이것은 내가 방금 끝내었던 정확하게 것 (긍정 판단을위한 ty)이다. – Prospero