bash: Algum problema ao usar a leitura “$ VARIABLE” em uma partição raiz somente de leitura. Quaisquer soluções conhecidas?

11

Apenas por coincidência eu tive que usar o meu script ATA-ID-to-device-name (encontrado aqui: link ) em uma partição somente leitura / . Caso você esteja curioso, foi um console de recuperação do Ubuntu que permitirá que você acesse sua partição / , mas o montará como somente leitura por padrão. Fico feliz com isso, porque senão provavelmente nunca teria descoberto que meu script se comporta estranhamente em um sistema de R / O devido a uma linha específica, esta:

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

Isso não funciona se não houver permissão de gravação. Eu não teria assumido que iria falhar, no entanto. Mas, aparentemente, o operador <<< requer a gravação de algum arquivo temporário em algum lugar.

Mas existe alguma maneira de contornar a criação de um arquivo temporário ou existe alguma maneira de especificar onde o arquivo é gravado? No console de recuperação do Ubuntu, existe - estranhamente - permissão de escrita no diretório /run , então, se eu pudesse de alguma forma "dizer" read para gravar o arquivo temporário em algum lugar diferente do usual .

    
por syntaxerror 02.11.2013 / 23:05

3 respostas

8

Um array pode fazer a análise de string sem a necessidade de um arquivo temporal. Não se esqueça de desligar a globulação.

set -f
IFS=: Hosts=($HostFull)
HostMain=${Hosts[0]}
HostMid=${Hosts[1]}
HostSub=${Hosts[2]}
set +f
    
por 03.11.2013 / 00:06
4

Concordo com @gniourf_gniourf, o que provavelmente requer acesso de gravação, mas não aos descritores de arquivos, provavelmente um arquivo.

Você pode testar isso rastreando a execução de seu comando quando estiver na partição somente leitura.

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

O acima será executado strace no shell Bash (processo $$ ). Em seguida, ele dorme por 1 segundo e, em seguida, executa o read da HERE STRING. Coloquei a string "hi" nessa posição. Eu, então, sleep por mais um segundo e, em seguida, kill o strace .

Exemplo

Ao analisar essa saída, você notará que um arquivo é aberto como O_WRONLY , que é para gravar em um arquivo.

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

Acima podemos ver qual arquivo está sendo gravado por sua sequência de comandos.

    
por 03.11.2013 / 00:08
3

Eu acho os parâmetros posicionais muito úteis para esse tipo de tarefa. Geralmente é portátil para todos os shells e não custa garfos nem arquivos temporários.

$ HostFull=main:mid:sub    
$ oldIFS=$IFS; IFS=:; set -- $HostFull; IFS=$oldIFS
$ echo $1
main
$ echo $2
mid
$ echo $3
sub
    
por 03.11.2013 / 02:07