Il y a parfois quelque chose, j'ai demandé ce qui n'allait pas sur un script de bash que j'essayais de faire et j'ai eu une excellente solution: Quel est le problème avec ce script automatique YouTube-DL?
Je continuais à modifier le script pour travailler avec différentes combinaisons de commandes YouTube-DL et à gérer mon Le script en question est-ce: P> #!/bin/bash
function video {
youtube-dl --no-warnings -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s' --socket-timeout 15 --hls-use-mpegts -R 64 --fragment-retries 64 --prefer-free-formats --all-subs --embed-subs -f 'bestvideo[height<=720]+bestaudio/best[height<=720]' "$@"
}
read -p "url: " url
video "$url"
while [ $? -ne 0 ]; do sleep 5 && video "$url" ; done
clear && echo completed!
3 Réponses :
in Bash, le personnage '-' au début d'une commande est utilisé pour définir une option, si vous souhaitez imprimer Correction: Printf '% s' '--PlayList ...' P> - Playlist ... code> Vous devez utiliser le caractère d'évacuation '\' . p>
Essayez quelque chose comme printf "\ - \ - playlist ..." code> s> p>
La solution appropriée à celle-ci est printf '% s' '--PlayList' code>. L'OP devrait probablement utiliser généralement une piqûre de format comme premier argument si elle insiste sur l'utilisation de printf code> (et apprenez à citer leurs chaînes).
Désolé, mais la suggestion de GCadiou n'a pas fonctionné: PrintF \ - \ - Playlist-Start = 15 https://www.youtube.com/playlist?list=pls1QULWO1RIMAXCEQW5J HK3B-6RGDWO_ | List720 Code> En outre, je ne comprendrais peut-être pas la suggestion de Tripleee, mais cela n'a pas fonctionné non plus: printf 'https://www.youtube.com/playlist?list=pls1QULWO1RIMAmaxceqw5 JHK3B-6RGDWO_' ' --Playlist-start = 15 '| LISTE720 CODE>
Le premier argument à printf code> est une chaîne de format. Pour imprimer une chaîne avec des tirets, printf '% s' '-code-with-tirets' code> et si vous souhaitez imprimer une autre chaîne également, ajoutez-les après la chaîne de format (la chaîne de format est répétée. jusqu'à ce que tous les arguments soient épuisés). Vous n'avez toujours pas besoin ou que vous voulez faire cela, comme expliqué dans mon commentaire original à la question.
Mon frère (un programmeur "à la retraite") a pris du temps pour évaluer comment fonctionne le script Bash et nous avons affiché une façon de faire fonctionner le script de manière plus simple en ajoutant simplement les commandes YouTube-DL et le URL YouTube en tant qu'arguments. P>
Le script a changé un peu, il ressemble maintenant à ceci: p> MAINTENANT, je dois juste écrire dans mon terminal:
List720 --PlayList-Start = 15 https://www.youtube.com/playlist?list=pls1QULWO1RIMAmaxceqw5JHK3B-6RGDWO_ Et cela fonctionne exactement comme je le veux. < / P> Merci beaucoup pour votre aide et vos suggestions! h2> h1>
Deux suggestions: Double-citez les références à $ @ code>, car parfois, cela fera des choses étranges aux références variables / paramètres non cotées. En outre, vous pouvez simplifier la boucle à jusqu'à la vidéo "$ @"; dormir 5; fait code>. Oh, et je recommande shellcheck.net pour signaler des erreurs courantes telles que les doubles citations manquantes.
Merci @gordon ... maintenant, j'ai une autre question (et encore, désolé si la question est trop "débutant" ... Je ne sais même pas comment m'expliquer en utilisant la bonne langue): dans votre boucle simplifiée Suggestion, comment Bash "sait" que je veux rappeler la vidéo "$ @" après le "dort 5"?
C'est ainsi que le jusqu'à code> boucle (et le très similaire pendant code> boucle). Il exécute le bit entre jusqu'à code> et faire code>, et si cela échoue, la pièce entre fait code> et fait code>, Ensuite, essayez à nouveau (à partir du jusqu'à code>) jusqu'à i> il réussit. (Un tandis que code> boucle a le test opposé: il continue à courir pendant que i> la partie de test réussit, c'est-à-dire jusqu'à ce qu'elle échoue.) Qu'est-ce qui peut vous déranger est que la partie de test est que la partie test t Juste un test passif, c'est une activité réelle (en fait, c'est l'activité que vous aimez); Mais tous les tests sont en réalité des activités, celle-ci est un peu plus active que la plupart.
Oui, je pense que je comprends ... je pense! ... Si je comprends bien, j'utilisais le "tandis que [$? -Ne 0]" Comme un "jusqu'à" et quand j'utilise le "Jusqu'à ce que" Il faut ajouter que "[$? J'ai ajouté les citations doubles et j'ai remplacé le moment avec la ligne jusqu'à la ligne et cela fonctionne comme prévu!
Pour fond sur ceci, voir Stackoverflow.com/questions/36313216/...
Un design bien meilleur est d'accepter toutes les options et l'URL en tant qu'arguments de ligne de commande. Les scripts nécessitant des E / S interactifs sont Pesky à inclure dans des scripts plus importants et généralement plus difficiles à utiliser (vous perdez la possibilité d'utiliser l'historique d'achèvement de l'onglet de votre coquille et de la ligne de commande, etc.).
list720 <<<'http://example.com/%7Efnord'
Vraisemblablement
- PlayList-Start = 15 Code> doit être une option sur votre script, pas surprintf code> ou quelque chose que vous souhaitez imprimer sur l'entrée standard du script. La syntaxe pour cela estprintf "$ url" | List720 --PlayList-Start = 15 code>. Les trucs avant| code> est une commande indépendante que votre script n'a aucune connaissance de.J'ai essayé votre suggestion et ça ne marche toujours pas ... E.g.:
Printf https://www.youtube.com/playlist?list=pls1QULWO1RIMAXCEQW5J HK3B-6RGDWO_ | List720 --PlayList-Start = 15 code>Vous ne voulez pas utiliser une URL en tant que chaîne de format code> printf code>. En outre, les URL contiennent des caractères interprétés par la coquille. Essayez
printf "% s" 'https: //...gdw0_' code>. C'est-à-dire que l'URL soit une dispute à la conversion code>% s code> spécifiée et placez-la en guillemets simples. S'il contient des guillemets simples, vous pouvez remplacer celles par'\' '' code> (citation backslash citation citation).