(ton premier langage devrait être utile: sh) Re: Changer le répertoire courant ?

2020-05-22 Par sujet Marc Chantreux
> Une suggestion serait de changer de langage de script, et prendre par
> exemple Guile  ou Python
>  ou Lua .

je suis toujours consterné d'avoir à me tapper 300 lignes de python
pour finalement me rendre compte que quelques lignes de shell aurait
pu suffir.

mon interpreteur préféré étant de loin zsh. toutefois quand je vois
qu'il est possible d'écrire simplement les choses avec dash ou rc, je ne
m'en prive pas (si bash est le plus utilisé, c'est aussi le plus inutile) 

le possède des commandes et concepts de haut niveau pour la manipulation
des fichiers programmes dispo sur ta machine, permet d'appréender des concepts
comme le parallèlisme, la composition, la modularité, les streams bien
plus simplement que les autres langages, un interpreteur shell est léger
et traine peu de dépendences... de plus si tu as besoin d'un
langage de programmation au quotidien dans la vie d'un unixien c'est
bien le shell.

donc si il y a *un* langage a connaitre c'est le shell (et tous ses
compagnons: awk, sed, bc selon tes besoins...)

> plus lisibles et permettant des scripts plus concis et plus maintenables
> qu'avec bash  (ou même zsh ).

vraiment: tout dépend de ce que tu appelles lisible ... pour faire ce
genre de taches, ta proposition me semble contre-productive.

> Bien évidemment, Guile comme Python comme Lua sont packagés par Debian.

et quitte à choisir un langage dynamique en 2020, je te conseile
d'en apprendre un qui n'aie pas 25 de casseroles à trainer comme ces 3
là: http://raku.org. et si raku est un peu trop frais pour toi: si je
devais garder *un seul* langage dynamique des années 90, ce serait perl
évidement.

cordialement,
marc



Re: Changer le répertoire courant ?

2020-05-22 Par sujet Marc Chantreux
salut,


* read renvoie faux quand il ne peut plus lire donc


{ find ./ -iname \*.mp4
  echo "EOF"
} | {
while true; do
read -r i
test "$i" = "EOF" && break
f_image-fusion "$i"
}

s'écrit plus traditionelement

{ find ./ -iname \*.mp4
  echo "EOF"
} | {
while IFS= read -r i; do
f_image-fusion "$i"
done
}

mais les boucles while sur des read en shell c'est pas très
efficace: l'outils posix pour faire ce que tu veux faire est xargs

find ./ -iname \*.mp4 -print0 |xargs -IX ffmpeg -i X image%d.jpg

> Je fais cela sur dés répertoire, et j’aurai aimer rediriger la sortie de la 
> fonction  f_image-fusion sur un autre répertoire que le courant, sans avoir à 
> imbriquer une autre boucle est-ce que c’est possible ?

ce que je comprend c'est que tu veux que les images soient générées dans
un autre répertoire que le répertoire courant. pour cela il te faut
juste modifier le template du nom de fichier

find ./ -iname \*.mp4 -print0 |
xargs -0 -IX ffmpeg -i X /tmp/image%d.jpg

si ton répertoire de destination est dépendant du répertoire dans lequel
se trouve le mp4, il faut produire la liste des arguments de ffmpeg
avec find et les passer à xargs.

si j'ai compris correctement ton problème, ton script final est

find tmp/born/ -type f -printf '%f\0%h/image%%d.jpg\0' |
xargs -0 -n2 ffmpeg -i

a+
marc



Re: Changer le répertoire courant ?

2020-05-21 Par sujet Basile Starynkevitch


On 5/22/20 5:59 AM, ptilou wrote:

Slt,

#!/bin/bash

function f_image-fusion {
 
  ffmpeg -i $0 image%d.jpg

 }
{
   find ./ -iname \*.mp4
   echo "EOF"
 } | {
  while true; do
  read -r i
  test "$i" = "EOF" && break
  f_image-fusion "$i"
 done
 }
Je fais cela sur dés répertoire, et j’aurai aimer rediriger la sortie de la 
fonction  f_image-fusion sur un autre répertoire que le courant, sans avoir à 
imbriquer une autre boucle est-ce que c’est possible ?


Et comment ?
Merci



Il convient de lire (en anglais) /Advanced Linux Programming/ 
 puis syscalls(2) 
 puis execve(2) 
 puis fork(2) 
 puis credentials(7) 
 puis bash(1) 



Le répertoire courant (voir getcwd(3) 
 ...) est propre à 
chaque processus 
. En particulier 
à celui créé par l’exécution de ton script ou bien à celui exécutant le 
shell de ton terminal.


Une possibilité serait de complexifier ton script (par exemple avec 
getopt(1)  ...) pour 
y ajouter une option qui modifie le répertoire courant du shell 
exécutant ton script.


Une suggestion serait de changer de langage de script, et prendre par 
exemple Guile  ou Python 
 ou Lua . Je les trouve 
tous plus lisibles et permettant des scripts plus concis et plus 
maintenables qu'avec bash  (ou même 
zsh ).


Bien évidemment, Guile comme Python comme Lua sont packagés par Debian.

--
Basile STARYNKEVITCH   == http://starynkevitch.net/Basile
opinions are mine only - les opinions sont seulement miennes
Bourg La Reine, France; 
(mobile phone: cf my web page / voir ma page web...)