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, ...)
.