변수 파일 설명자를 사용하여 실행

변수 파일 설명자를 사용하여 실행

이것이 불가능한 이유는 무엇이며 이를 해결하는 가장 좋은 방법은 무엇입니까?

#!/bin/sh
desc=5; file=/etc/passwd
exec "$desc"<"$file" #the variable filedescriptor is the problem

나는 차라리하지 않을 것입니다 eval.

답변1

글쎄, 왜 이것이 가능하지 않은지에 대해서는 다음과 같이 하고 싶지 않습니다.

echo "$text">file

$x숫자인 경우 작동이 중지됩니다.

다음을 수행해야 합니다.

eval 'exec '"$desc"'< "$file"'

쉘이 exec 5< "$file"코드를 평가하게 하십시오. eval인수에서 확장해야 할 부분만 조심스럽게 확장하는 한(그리고 이러한 확장은 안전합니다)(여기서는 를 제외한 모든 항목에 대해 큰 따옴표를 사용하세요 $desc) 괜찮습니다. 실수는 eval "exec $desc< $file"쉘에 제공된 내용을 쉘 코드로 평가하는 것일 수 있습니다.$file

Pass 를 사용하면 모듈 의 내장 함수를 zsh사용할 수도 있습니다 .sysopenzsh/system

zmodload zsh/system
sysopen -u "$desc" -r -- "$file"

함께zsh 하다bashksh93

exec {desc}>&-

다음에 저장된 fd를 닫을 $desc수 있습니다.

exec {desc}> file

쉘은 10보다 큰 fd를 할당하고분배하다그렇습니다 . 이것은 미리 저장된 fd를 $desc여는 데 사용할 수 없습니다 .file$desc

이것은 exec >&"$desc"모호함이 없기 때문에 작동한다는 점에 유의하십시오. zsh최신 버전 에는 stdout 및 stderr을 파일(예: )로 리디렉션하고 숫자가 아닌 경우에만 작동하는 연산자가 bash있다는 점만 제외하면 됩니다.>&cshecho something >& "$file"$file

관련 정보