¿Hay alguna manera de crear un script y hacerlo ejecutable en menos código que este?

8

Mi código para crear un script ejecutable

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh
Sham Fiorin
fuente
2
@ShamFiorin Quería enfatizar la respuesta de la primera parte de los postres. Debe intentar usar sudocon moderación. Tener el hábito de tirarlo puede ser peligroso. En este caso, usted posee el script que creó para que pueda hacer lo que quiera con los permisos, sin necesidad de sudo.
Marie
2
Relacionado de manera general: Consejos para jugar golf en Bash
Digital Trauma

Respuestas:

18

Puede omitir todo el touchcomando y no hay necesidad de usarlo sudo. Para acortar aún más la línea de comando, puede usar la bashexpansión de historial para guardar el nombre de archivo por segunda vez y omitir espacios innecesarios:

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

La expansión del historial se reemplaza !#:3con la cuarta palabra de la línea de comando actual, que en su caso es el nombre del archivo script.sh. Por supuesto, esto debe adaptarse en caso de que modifique el primer comando, por ejemplo:

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

Tenga en cuenta que un script válido necesita un shebang :

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

Si necesita esta cadena de comandos con más frecuencia, le recomiendo que defina una función , de esta manera solo necesitará escribir el nombre de la función. Una forma igualmente adaptable, aunque más larga, es el uso de una variable que contenga el nombre del archivo:

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

Si su nombre de archivo contiene caracteres especiales, no olvide citarlos correctamente .

postre
fuente
20

El installcomando (parte de GNU junto con coreutils cp, mv, rm, etc.) puede copiar un archivo al mismo tiempo que el establecimiento de su propiedad y los permisos y la creación de directorios padre si es necesario. Por defecto hará que el nuevo archivo sea ejecutable. No entiende ' -' pero /dev/stdinpuede usarse en su lugar:

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

Lo anterior usa una ' cadena aquí ' para proporcionar el texto en stdin, que es un poco más corto que ponerlo. Los argumentos para echono necesitar comillas a menos que contengan caracteres con un significado especial.

deltab
fuente
tenga en cuenta que la herejía es un Bashismo - un heredoc sería portátil
Steven Penny
3
Buena idea. También podría usar una sustitución de proceso :install <(echo echo Hello World) script.sh
Digital Trauma
8

Prefiero usar catpara tareas como esta:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D
conductor de acero
fuente
1

También puede omitir todo el chmod y usar umask en su lugar antes del eco. Debería ahorrarte unos pocos bytes. Shebang es opcional siempre que use comandos que todos los shell entienden (bourne y C principalmente).

GruñónGurú
fuente
55
¿Cómo harías eso exactamente?
wjandrea
No es posible usarlo umaskpara configurar el bit ejecutable de forma predeterminada ...
Ravexina