Trempant mes orteils dans le codage Bash pour la première fois ( pas la personne la plus expérimentée avec Linux non plus ) et j'essaye de lire la version à partir du version.php
dans un conteneur à:
/config/www/nextcloud/version.php
Pour ce faire, je cours:
docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?" /config/www/nextcloud/version.php
Cela utilise un modèle RegEx de versioning sémantique ( je sais, un peu exagéré, mais cela fonctionne pour l'instant ) pour lire et extraire la version de la ligne:
$OC_VersionString = '20.0.1';
Cependant, quand je lance la commande , il me dit No such file or directory
, (je l' ai confirmé qu'il ne existe à ce chemin à l' intérieur du conteneur) et procède ensuite à cracher sur le contenu du fichier , il a juste dit n'existe pas ?
grep: (0 | [1-9] \ d *). (0 | [1-9] \ d *). (0 | [1-9] \ d *) (?: - ((?: 0 | [1-9] \ d * | \ d * [a-zA-Z -] [0-9a-zA-Z-] ) (?:. (?: 0 | [1-9] \ d | \ d * [a-zA-Z -] [0-9a-zA-Z-] )) ))? (?: + ([0-9a-zA-Z -] + (?:. [0-9a-zA -Z -] +) *))?: Aucun fichier ou répertoire de ce type /config/www/nextcloud/version.php:$OC_Version = array (20,0,1,1); /config/www/nextcloud/version.php:$OC_VersionString = '20 .0.1 '; /config/www/nextcloud/version.php:$OC_Edition = ''; /config/www/nextcloud/version.php:$OC_VersionCanBeUpgradedFrom = array (/config/www/nextcloud/version.php: 'nextcloud' => /config/www/nextcloud/version.php: 'owncloud' => / config /www/nextcloud/version.php:$vendor = 'nextcloud';
Quelqu'un est-il capable de déceler le problème?
Mise à jour 1:
Par souci de clarté, j'essaye d'exécuter ceci à partir d'un script bash. Je veux juste récupérer le numéro de version de ce fichier, pour l'utiliser dans d'autres zones du script.
Mise à jour 2:
En réponse aux commentaires, j'ai d'abord essayé de me connecter au conteneur, puis d'exécuter le grep et d'obtenir toujours le même résultat. Ensuite, je chat ce fichier et il montre que son contenu ne pose aucun problème.
3 Réponses :
Connectez-vous d'abord au conteneur à l'aide de la commande ci-dessous, puis essayez de lire la version à partir du version.php
intérieur d'un conteneur.
docker exec -it 1c8c05daba19 /bin/bash
Une fois que vous vous êtes connecté au conteneur, vous pouvez lire la version à partir du version.php
J'essaye d'exécuter ceci à partir d'un script bash.
Je viens de mettre à jour le message original pour ajouter un peu de clarté. J'avais juste supposé que cela pouvait être évident après l'avoir lu, mais peut-être que ce n'était pas le cas.
De nombreux conteneurs n'ont pas les versions GNU des outils Unix et leurs diverses extensions. Il est courant de baser les conteneurs sur Alpine Linux, qui à son tour utilise un outil binaire unique très léger appelé BusyBox pour fournir les outils de base. Ceux-ci ont tendance à avoir l'ensemble des options requises dans les spécifications POSIX, et pas plus.
POSIX grep (1) en particulier n'a pas d'option -o
. Donc, la commande que vous exécutez est
sed -e 's/.*\(any regexp here\).*/\1/' input-file
Notez que la sortie de grep
dans le shell interactif ne contient que des lignes avec la lettre "o", mais pas par exemple la ligne contenant juste un array
.
POSIX grep n'a pas d'équivalent pour l' option -o de GNU grep
Imprimez uniquement les parties correspondantes (non vides) des lignes correspondantes, chacune de ces parties sur une ligne de sortie distincte. Les lignes de sortie utilisent les mêmes délimiteurs que l'entrée ....
mais c'est facile de le faire avec sed (1) à la place. Demandez-lui de faire correspondre certains éléments, l'expression rationnelle en question et d'autres éléments, et remplacez-le par le groupe correspondant.
grep \ -eo \ # specify "o" as the regexp to match "(regexps are write-only)" \ # a filename /config/www/nextcloud/version.php # a second filename
(POSIX sed n'accepte que les expressions régulières de base, vous devrez donc échapper davantage de parenthèses.)
Merci @David Maze, j'avais également pensé à vérifier la version de grep à l'intérieur du conteneur juste avant de lire votre message et j'ai fait un rapide grep --help
. Et vous avez raison, il utilise une version de busybox allégée qui semble également avoir besoin d'un argument -f
pour le nom de fichier, mais curieusement, il a toujours l'argument -o
. i.imgur.com/hKqEkei.png Je n'arrive toujours pas à le faire fonctionner, alors je vais donner une chance à votre suggestion sed.
Cela semble-t-il correct? sed -e 's/.*\([0-9]{1,2}\)+[.]+\([0-9]{1,2}\)+[.]+\([0-9]{1,2}\).*/\1/' /config/www/nextcloud/version.php
. Essayer un autre regex, mais quand je l'utilise, il renvoie simplement tout le contenu du fichier.
Même résultat avec plus de caractères d' sed -e 's/.*\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{1,2\}\).*/\1/' /config/www/nextcloud/version.php
: sed -e 's/.*\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{1,2\}\).*/\1/' /config/www/nextcloud/version.php
Eh bien, pour tous les futurs lecteurs potentiels, je n'ai pas eu de chance de faire en sorte que grep
le fasse, je suis sûr que c'était de ma faute et pas de grep, mais grâce à l'aide de cet article, j'ai pu utiliser awk
au lieu de grep
, comme donc:
docker exec -it 1c8c05daba19 awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){print substr($0,RSTART+1,RLENGTH-2)}' /config/www/nextcloud/version.php
Cela a fini par faire exactement ce dont j'avais besoin:
/config/www/nextcloud/version.php
à l'intérieur du conteneur.
La commande docker exec -it est utilisée pour vous connecter au conteneur et une fois que vous vous êtes connecté, vous pouvez grep. donc, connectez-vous d'abord au conteneur docker exec -it 1c8c05daba19 puis recherchez avec regexp
hmm, connectez-vous au conteneur, vérifiez si le fichier existe, essayez d'exécuter le bash après vous être connecté, vérifiez si cela fonctionne bien. 99% vous avez peut-être fait une simple erreur