Por coincidência, tive que usar meu script ATA-ID-to-device-name (encontrado aqui: /server/244944/linux-ata-errors-translating-to-a-device-name/ 426561 # 426561 ) em uma partição somente leitura /
. Caso você esteja curioso, era um console de recuperação do Ubuntu que permitirá acessar sua /
partição, mas a montará como somente leitura por padrão. Fico feliz com isso, porque, caso contrário, 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 não precisa para escrever um arquivo temporário para algum lugar.
Mas existe alguma maneira de burlar a criação de um arquivo temporário ou existe alguma maneira de especificar para onde o arquivo foi gravado? No console de recuperação do Ubuntu, existe --- estranhamente --- permissão de gravação no /run
diretório, o que seria suficiente , se eu pudesse, de alguma forma, "dizer" read
para gravar o arquivo temporário em outro lugar que o normal.
/dev/fd
não tem nada a ver com isso.<<<
é o culpado, porque cria um arquivo temporário (que precisa ser gravado em algum lugar).Respostas:
Uma matriz pode fazer a análise da string sem a necessidade de um arquivo temporal. Não se esqueça de desligar o globbing.
fonte
IFS
, se você estiver certo de que não existem espaços em$HostFull
assim:Hosts=( ${HostFull//:/ } )
. Ou mesmo se houver espaços:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(ou algo semelhante, estou ficando confuso:D
).Concordo com @gniourf_gniourf, você provavelmente está precisando de acesso de gravação, mas não aos descritores de arquivos, provavelmente um arquivo.
Você pode testar isso rastreando a execução do seu comando na partição somente leitura.
O acima será executado
strace
no shell Bash (processo$$
). Em seguida, ele dorme por 1 segundo e, em seguida, executa o aread
partir do HERE STRING. Eu coloquei a corda"hi"
nesta posição. Eu entãosleep
por mais um segundo e depoiskill
ostrace
.Exemplo
Ao analisar esta saída, você notará que um arquivo é aberto como
O_WRONLY
, que é para gravar em um arquivo.Acima, podemos ver para que arquivo está sendo gravado sua sequência de comandos.
fonte
read
que abre um arquivo para escrever (isso seria bobo), é<<<
./tmp
ser um caminho codificado . E, provavelmente, você adivinhou,/tmp
é já ali, mas só de leitura também! E, como trabalhar nesse console de recuperação me fará logon no meu sistema de arquivos ao vivo , eu não gostaria de mexer lá por ligação simbólica ou o que quer que seja (nem mesmo enquanto estiver nesse console).Acho parâmetros posicionais muito úteis para esse tipo de tarefa. Também é geralmente portátil para todas as conchas e não custa garfos nem arquivos temporários.
fonte
$1
,$2
,$3
coisa: lembre-se que em um script, isso geralmente representam um argumento passado para o script em si . - E enquanto estamos nisso: se o IFS for um espaço, * IFS = * não funcionará nesta sintaxe; você precisará especificar IFS = '' explicitamente.