Par pure coïncidence, j'ai dû utiliser mon script ATA-ID-to-device-name (trouvé ici: /server/244944/linux-ata-errors-translating-to-a-device-name/ 426561 # 426561 ) sur une partition en lecture seule /
. Au cas où vous seriez curieux, c'était une console de récupération Ubuntu qui vous permettra d'accéder à votre /
partition, mais la montera en lecture seule par défaut. Je m'en réjouis, car sinon je n'aurais probablement jamais découvert que mon script se comportait étrangement sur un système R / O en raison d'une ligne spécifique, celle-ci:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Cela ne fonctionne pas s'il n'y a aucune autorisation d'écriture. Je n'aurais pas pensé que cela échouerait cependant. Mais apparemment , l' <<<
opérateur ne nécessite d'écrire du fichier temporaire à quelque part.
Mais existe-t-il un moyen de contourner la création d'un fichier temporaire ou existe-t-il un moyen de spécifier où le fichier est écrit? Dans la console de récupération d'Ubuntu, il y a --- assez bizarrement --- la permission d'écrire sur le /run
répertoire, ce qui ferait l'affaire, si je pouvais en quelque sorte "dire" read
d'écrire le fichier temporaire ailleurs que d'habitude.
/dev/fd
n'a rien à voir avec cela.<<<
est le coupable, car il crée un fichier temporaire (qui doit être écrit quelque part).Réponses:
Un tableau pourrait faire l'analyse de la chaîne sans avoir besoin d'un fichier temporel. N'oubliez pas de désactiver le globbing.
la source
IFS
, si vous êtes sûr qu'il n'y a pas d' espaces dans$HostFull
comme ceci:Hosts=( ${HostFull//:/ } )
. Ou même s'il y a des espaces:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(ou quelque chose de similaire, je m'embrouille:D
).Je suis d'accord avec @gniourf_gniourf, vous avez probablement besoin d'un accès en écriture mais pas aux descripteurs de fichiers, probablement un fichier.
Vous pouvez tester cela en retraçant l'exécution de votre commande dans la partition en lecture seule.
Ce qui précède s'exécutera
strace
sur le shell Bash (processus$$
). Il dort ensuite pendant 1 seconde, puis exécute le àread
partir de la chaîne ICI. J'ai mis la chaîne"hi"
dans cette position. J'ai ensuitesleep
une seconde de plus puiskill
lestrace
.Exemple
Lors de l'analyse de cette sortie, vous remarquerez qu'un fichier est ouvert en tant que
O_WRONLY
, ce qui est destiné à l'écriture dans un fichier.Ci-dessus, nous pouvons voir dans quel fichier est écrit votre séquence de commandes.
la source
read
ça qui ouvre un fichier pour l'écriture (ce serait idiot), ça l'est<<<
./tmp
est un hardcoded chemin. Et vous l'avez probablement deviné,/tmp
EST déjà là, mais aussi en lecture seule! Et puisque travailler sur cette console de récupération me fera me connecter à mon système de fichiers en direct , je ne voudrais pas me déranger là-bas par lien symbolique ou autre (même pas dans cette console).Je trouve les paramètres positionnels très utiles pour ce genre de tâche. Il est également généralement portable pour tous les shells, et ne coûte ni fourches ni fichiers temporaires.
la source
$1
,$2
, des$3
choses: rappelez - vous que dans un script, ce sera généralement un support argument passé au script lui - même . - Et tant que nous y sommes: si IFS est censé être un espace, * IFS = * ne fonctionnera pas dans cette syntaxe; vous devrez spécifier IFS = '' explicitement.