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
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 .
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
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
.
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.
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
Tags bash tmp readonly here-document read