Solo por coincidencia tuve que usar mi script ATA-ID-to-device-name (que se encuentra aquí: /server/244944/linux-ata-errors-translating-to-a-device-name/ 426561 # 426561 ) en una partición de solo lectura /
. En caso de que tenga curiosidad, era una consola de recuperación de Ubuntu que le permitirá acceder a su /
partición, pero la montará de solo lectura de forma predeterminada. Me alegro de eso, porque de lo contrario, probablemente nunca habría descubierto que mi script se comporta de manera extraña en un sistema R / O debido a una línea específica, esta:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Esto no funciona si no hay permiso de escritura. Sin embargo, no habría asumido que fallaría. Pero al parecer, el <<<
operador no necesita escribir algún archivo temporal a alguna parte.
Pero, ¿hay alguna forma de eludir la creación de un archivo temporal o hay alguna forma de especificar dónde se escribe el archivo? En la consola de recuperación de Ubuntu, hay --- curiosamente --- permiso de escritura en el /run
directorio, por lo que sería suficiente si pudiera de alguna manera "decirle" read
que escriba el archivo temporal en otro lugar de lo habitual.
/dev/fd
no tiene nada que ver con esto.<<<
Sin embargo, es el culpable, porque crea un archivo temporal (que debe escribirse en alguna parte).Respuestas:
Una matriz podría hacer el análisis de la cadena sin la necesidad de un archivo temporal. No te olvides de desactivar el engorde.
fuente
IFS
, si está seguro de que no hay espacios en$HostFull
que así:Hosts=( ${HostFull//:/ } )
. O incluso si hay espacios:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(o algo similar, me estoy confundiendo:D
).Estoy de acuerdo con @gniourf_gniourf, probablemente necesites acceso de escritura pero no a los descriptores de archivo, probablemente un archivo.
Puede probar esto rastreando la ejecución de su comando cuando está en la partición de solo lectura.
Lo anterior se ejecutará
strace
en el shell Bash (proceso$$
). Luego duerme durante 1 segundo y luego ejecutaread
el AQUÍ de la CADENA. He puesto la cuerda"hi"
en esta posición. Luegosleep
por un segundo más y luegokill
elstrace
.Ejemplo
Al analizar esta salida, notará que un archivo se abre como
O_WRONLY
, que es para escribir en un archivo.Arriba podemos ver en qué archivo está siendo escrito por su secuencia de comandos.
fuente
read
que abra un archivo para escribir (eso sería una tontería), es<<<
./tmp
es un codificado camino. Y probablemente lo hayas adivinado, ya/tmp
está allí, ¡pero también de solo lectura! Y dado que trabajar en esa consola de recuperación me hará iniciar sesión en mi sistema de archivos en vivo , no me gustaría meterme allí simpatizando o lo que sea (ni siquiera mientras esté en esa consola).Encuentro parámetros posicionales muy útiles para este tipo de tarea. Por lo general, también es portátil para todos los shells y no cuesta tenedores ni archivos temporales.
fuente
$1
,$2
,$3
cosas: recordar que en una secuencia de comandos, lo cual suele reposar por un argumento pasado a la secuencia de comandos en sí . - Y mientras estamos en eso: si IFS está destinado a ser un espacio, * IFS = * no funcionará en esta sintaxis; Tendrá que especificar IFS = '' explícitamente.