쉘 스크립트에서 TCP 소켓을 열기 위해 파일 설명자를 매개변수화

쉘 스크립트에서 TCP 소켓을 열기 위해 파일 설명자를 매개변수화

exec 명령을 사용하여 TCP 소켓을 열기 위해 변수의 파일 설명자 번호를 매개변수화하려고 시도했지만 실패했습니다. 이는 파일 설명자 번호가 상수인 경우에만 작동합니다. 다음 예제 코드에서는 첫 번째 재시도만 성공합니다(RC=0).

암호:

echo -e "\nRetry 1: "
socket="/dev/tcp/$ip/$port"
exec 3<>$socket
echo "RC: $?"


echo -e "\nRetry 2: "
descriptor=3
socket="/dev/tcp/$ip/$port"
exec $descriptor<>$socket
echo "RC: $?"


echo -e "\nRetry 3: "
descriptor="3"
socket="/dev/tcp/$ip/$port"
exec $descriptor<>$socket
echo "RC: $?"

echo -e "\nRetry 4: "
descriptor=3
socket="/dev/tcp/$ip/$port"
exec "$descriptor"<>$socket
echo "RC: $?"

echo -e "\nRetry 5: "
descriptor=3
socket="/dev/tcp/$ip/$port"
`exec $descriptor<>$socket`
echo "RC: $?"

출력은 다음과 같습니다

Retry 1:
RC: 0

Retry 5:
socket.sh: line 46: exec: 3: not found
RC: 127

또는 다른 경우에는 다음과 같습니다.

Retry 1:
RC: 0

Retry X:
socket.sh: line 27: exec: 3: not found

답변1

다음을 생각하면 왜 실패하는지 쉽게 알 수 있습니다.

echo $text>some-file

$text숫자가 포함된 경우 다르게 동작하는 것을 원하지 않을 것입니다.

여기에서 사용해야 합니다 eval:

eval 'exec '"$fd"'> "$file"'

$fd( 인수에서 확장을 예상했지만 eval그렇지 않습니다 $file.)

ksh93, zsh 및 bash에서는(2005년 4월, zsh 4.3.0, bash 4.1-alpha, ksh93r) 동적 fd를 가질 수 있는 가능성을 도입했습니다. 예를 들면 다음과 같습니다.

exec {fd}> "$file"

여기서는 파일 설명자(10개 이상의 자유 설명자)가 셸에 의해 선택되어 $fd변수에 저장됩니다.

와 결합할 수 있습니다 ... >&$fd.

이는 다른 언어에서 수행하는 작업( fd = open(...), ) 과 더 일관성이 있습니다 write(fd, ...).

관련 정보