bash: 읽기 전용 루트 파티션에서 read <<<"$VARIABLE"을 사용할 때 일부 문제가 있습니다. 알려진 해결 방법이 있나요?

bash: 읽기 전용 루트 파티션에서 read <<<"$VARIABLE"을 사용할 때 일부 문제가 있습니다. 알려진 해결 방법이 있나요?

우연히도 ATA-ID-장치 이름 스크립트를 사용해야 했습니다(여기에서 찾을 수 있음:https://serverfault.com/questions/244944/linux-ata-errors-translated-to-a-device-name/426561#426561)안에읽기 전용 /분할. 궁금하다면 /파티션에 액세스할 수 있지만 기본적으로 읽기 전용으로 마운트되는 Ubuntu 복구 콘솔이 있습니다. 그렇지 않았다면 R/O 시스템에서 다음과 같은 특정 라인으로 인해 내 스크립트가 이상하게 동작한다는 사실을 결코 발견하지 못했을 것이기 때문에 다행입니다.

IFS=: read HostMain HostMid HostSub <<< "$HostFull"

이것은 실제로아니요쓰기 권한 없이 작동합니다. 하지만 실패할 거라고는 생각하지 않습니다. 하지만 분명히 <<<운영자는하다일부 임시 파일은 어딘가에 작성해야 합니다.

그런데 임시 파일 생성을 방지하는 방법이 있나요? 아니면 파일이 기록되는 위치를 지정하는 방법이 있나요? Ubuntu 복구 콘솔에서는 이상하게도 /run디렉터리에 쓰기 권한이 있으므로 어떻게든 임시 파일이 평소가 아닌 다른 곳에 쓰도록 "알릴" 수 있다면 read괜찮을 것입니다.

답변1

배열을 사용하면 임시 파일 없이도 문자열 구문 분석이 가능합니다. 와일드카드를 끄는 것을 잊지 마세요.

set -f
IFS=: Hosts=($HostFull)
HostMain=${Hosts[0]}
HostMid=${Hosts[1]}
HostSub=${Hosts[2]}
set +f

답변2

@gniourf_gniourf에 동의합니다. 쓰기 권한이 필요할 수 있지만 파일 설명자(대부분 파일)는 필요하지 않습니다.

읽기 전용 파티션에서 명령 실행을 추적하여 이를 테스트할 수 있습니다.

{ strace -p "$$" & sleep 1; read var1 <<< "hi"; sleep 1; kill "$1"; }

위 코드는 straceBash 쉘(process $$)에서 실행됩니다. 그런 다음 1초 동안 대기한 다음 readHERE STRING에서 실행됩니다. "hi"이 위치에 로프를 놓았습니다 . 그런 다음 sleep1초 더 기다렸다가 .killstrace

O_WRONLY이 출력을 구문 분석할 때 파일에 쓰기 위해 파일이 열려 있음을 알 수 있습니다 .

open("/tmp/sh-thd-4137571604", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3

위에서 명령 시퀀스가 ​​어떤 파일에 기록되고 있는지 확인할 수 있습니다.

답변3

나는 그러한 작업에 위치 매개변수가 매우 유용하다고 생각합니다. 또한 일반적으로 모든 셸에 이식 가능하며 포크나 임시 파일이 필요하지 않습니다.

$ HostFull=main:mid:sub    
$ oldIFS=$IFS; IFS=:; set -- $HostFull; IFS=$oldIFS
$ echo $1
main
$ echo $2
mid
$ echo $3
sub

관련 정보