쉘에서 변수 값을 fd로 전달하는 방법

쉘에서 변수 값을 fd로 전달하는 방법

Linux 셸에서 한 번에 여러 파일을 열어야 하므로 시퀀스 값을 아래와 같이 fd 값으로 전달하는 것을 생각했습니다.

내 비밀번호에는 nile.300, nile.301,....nile.500이라는 파일이 있습니다.

그래서 fd 300을 사용하여 nile.300을 열고, nile.301을 fd 301로 열고 싶습니다.

#!/bin/bash
for i in {300..500};do FILENAME=nile.$i
    # Opening file descriptors # 3 for reading and writing
    # i.e. /tmp/out.txt
    exec $i<>$FILENAME

    # Write to file
    echo "Today is $(date)" >&$i
done

sleep 10; 
for i in {300..500};do
    # close fd # 3
    exec $i>&-
done

그러나 스크립트는 ./fd.sh: line 5: exec: 300: notfound로 실행되지 않습니다.

답변1

열려 있는 모든 파일을 동시에 작업할 계획이 아니라면 한 번에 하나의 파일을 처리하는 것이 더 나을 수 있습니다.

이 접근 방식을 사용하면 동시에 수백 개의 파일을 열어야 할 필요성이 없어져 잠재적으로 열린 파일 제한에 도달할 수 있습니다.

for i in {300..500};do
    FILENAME=nile.$i

    exec 3<>$FILENAME

    # Write to file
    echo "Today is $(date)" >&3
    # Close
    exec 3>&-
done

답변2

올바른 구문은 {variable}왼쪽에 있는 경우입니다.

exec {i}<>"$FILENAME"

echo "Today is $(date)" >&$i

exec {i}>&-

관련 정보