Existe-t-il un moyen de créer un script et de le rendre exécutable en moins de code que cela?

8

Mon code pour créer un script exécutable

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh
Sham Fiorin
la source
2
@ShamFiorin Je voulais souligner la première partie de la réponse des desserts. Vous devriez essayer de l'utiliser sudoavec parcimonie. Prendre l'habitude de le jeter peut être dangereux. Dans ce cas, vous possédez le script que vous avez créé afin que vous puissiez faire ce que vous voulez avec les autorisations, aucun sudo n'est nécessaire.
Marie
2
Liés d'une manière générale: Conseils pour jouer au golf à Bash
Digital Trauma

Réponses:

18

Vous pouvez omettre toute la touchcommande et il n'est pas nécessaire de l'utiliser sudo. Pour raccourcir davantage la ligne de commande, vous pouvez utiliser l' bashextension d'historique pour enregistrer le nom de fichier la deuxième fois et omettre les espaces inutiles:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3

L'expansion de l'historique remplace !#:3par le quatrième mot de la ligne de commande actuelle, qui dans votre cas est le nom de fichier script.sh. Bien sûr, cela doit être adapté si vous modifiez la première commande, par exemple:

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1

Notez qu'un script valide a besoin d'un shebang :

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1

Si vous avez besoin de cette chaîne de commandes plus souvent, je recommande de définir une fonction , de cette façon, il vous suffit de taper le nom de la fonction. Une manière également adaptable - bien que plus longue - est l'utilisation d'une variable contenant le nom de fichier:

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f

Si votre nom de fichier contient des caractères spéciaux, n'oubliez pas de les citer correctement .

dessert
la source
20

La installcommande (partie de GNU coreutils avec cp, mv, rm, etc.) peuvent copier un fichier tout en établissant la propriété et les autorisations et la création de répertoires parents au besoin. Par défaut, il rendra le nouveau fichier exécutable. Il ne comprend pas ' -' mais /dev/stdinpeut être utilisé à la place:

install /dev/stdin script.sh <<< "echo Hello World"

Ce qui précède utilise une " chaîne ici " pour fournir le texte sur stdin, qui est légèrement plus court que le piping. Les arguments echone nécessitent pas de citation à moins qu'ils ne contiennent des caractères ayant une signification spéciale.

deltab
la source
notez que l'héritage est un bashisme - un hérédoc serait portable
Steven Penny
3
Bonne idée. Vous pouvez également utiliser une substitution de processus :install <(echo echo Hello World) script.sh
Digital Trauma
8

Je préfère utiliser catpour des tâches comme celle-ci:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D
tournevis
la source
1

Vous pouvez également laisser de côté le chmod entier et utiliser umask à la place avant l'écho. Devrait vous faire économiser quelques octets. Shebang est optionnel tant que vous utilisez des commandes comprises par tous les shell (bourne et C principalement).

GrumpyGuru
la source
5
Comment feriez-vous cela exactement?
wjandrea
Il n'est pas possible d'utiliser umaskpour définir le bit exécutable par défaut ...
Ravexina