![bash: 읽기 전용 루트 파티션에서 read <<<"$VARIABLE"을 사용할 때 일부 문제가 있습니다. 알려진 해결 방법이 있나요?](https://linux55.com/image/3563/bash%3A%20%EC%9D%BD%EA%B8%B0%20%EC%A0%84%EC%9A%A9%20%EB%A3%A8%ED%8A%B8%20%ED%8C%8C%ED%8B%B0%EC%85%98%EC%97%90%EC%84%9C%20read%20%26lt%3B%26lt%3B%26lt%3B%22%24VARIABLE%22%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EC%9D%BC%EB%B6%80%20%EB%AC%B8%EC%A0%9C%EA%B0%80%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EC%95%8C%EB%A0%A4%EC%A7%84%20%ED%95%B4%EA%B2%B0%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
우연히도 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"; }
위 코드는 strace
Bash 쉘(process $$
)에서 실행됩니다. 그런 다음 1초 동안 대기한 다음 read
HERE STRING에서 실행됩니다. "hi"
이 위치에 로프를 놓았습니다 . 그런 다음 sleep
1초 더 기다렸다가 .kill
strace
예
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