Generador de archivos en shell script -- bash campo con shell camp codereview Relacionados El problema

File generator in shell script


2
vote

problema

Español

Soy un estudiante, y la mayoría de mis trabajos de laboratorio incluyen programas de escritura (generalmente .CPP), copiarlos, copie el código fuente y la salida a un archivo de Word y se envíe por correo un PDF al maestro en cuestión o envíe su impresión. (Todavía no obtengo el punto de enviar un programa en el archivo impreso o PDF, pero esto es lo que se nos pide que haga)

Así que escribí un pequeño script de Shell para ayudarme a automatizar estas cosas.

Los paquetes que estoy usando son:

  1. enscript
  2. ps2pdf
  3. pdftk

Aquí está el código Script:

  #!/bin/bash  TARGET='/home/angg/code' cd $TARGET  find . -type f -name '*.cpp' | while read CPPFILE do     TITLE=$(basename $CPPFILE .cpp)      g++ $TITLE.cpp       echo $CPPFILE | xargs enscript --color=1 -C -Ecpp -B -t $TITLE -o - | ps2pdf - $TITLE.pdf      ./a.out > $TITLE.txt && enscript -B $TITLE.txt -o - | ps2pdf - $TITLE.output.pdf      pdftk $TITLE.pdf $TITLE.output.pdf cat output $TITLE.final.pdf      rm $TITLE.output.pdf     rm $TITLE.pdf  done  today=`date +%j-%M`  pdftk *.pdf cat output $today.pdf   

I remitimos esto enlace Para convertir todos los archivos CPP a archivos PDF, para agregar la salida al final de cada archivo CPP, creé un PDF separado para la salida de cada programa y fusioné los dos PDF juntos usando pdftk y luego eliminar los PDF no es necesario ahora

Necesito una revisión con respecto al código y si puedo acortarlo. Además, soy nuevo en todos estos paquetes utilizados y querría saber si hay alguna redundancia que pueda evitar.

Original en ingles

I'm a student, and most of my lab work includes writing programs (usually .cpp) run them, copy the source code and output to a word file and either mail a pdf to the concerned teacher or submit in print. (I still don't get the point of submitting a program in print or pdf file, but this is what we're asked to do)

So I wrote a little shell script to help me automate this stuff.

The packages I'm using are:

  1. enscript
  2. ps2pdf
  3. pdftk

Here is the script code:

#!/bin/bash  TARGET='/home/angg/code' cd $TARGET  find . -type f -name '*.cpp' | while read CPPFILE do     TITLE=$(basename $CPPFILE .cpp)      g++ $TITLE.cpp       echo $CPPFILE | xargs enscript --color=1 -C -Ecpp -B -t $TITLE -o - | ps2pdf - $TITLE.pdf      ./a.out > $TITLE.txt && enscript -B $TITLE.txt -o - | ps2pdf - $TITLE.output.pdf      pdftk $TITLE.pdf $TITLE.output.pdf cat output $TITLE.final.pdf      rm $TITLE.output.pdf     rm $TITLE.pdf  done  today=`date +%j-%M`  pdftk *.pdf cat output $today.pdf 

I referred this link to convert all cpp files to pdf files, to add output at the end of each cpp file, I created a separate pdf for output of each program and merged the two pdfs together using pdftk and then removing pdfs not needed now

I need a review regarding the code and if I can shorten it. Also, I'm new to all these packages used and would want to know if there's any redundancy I could avoid.

     
     
     

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Sugerencias automatizadas

Si no tiene shellcheck instalado, córtelo o use el servicio en línea. Informa un montón de construcciones cuestionables:

  202986.sh:4:1: warning: Use 'cd ... || exit' or 'cd ... || return' in case cd fails. [SC2164] 202986.sh:6:38: note: read without -r will mangle backslashes. [SC2162] 202986.sh:8:22: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:10:9: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:12:10: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:12:61: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:12:84: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:14:15: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:14:41: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:14:68: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:16:11: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:16:22: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:16:51: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:18:8: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:19:8: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:23:7: note: Use $(..) instead of legacy `..`. [SC2006] 202986.sh:25:7: note: Use ./*glob* or -- *glob* so names with dashes won't become options. [SC2035] 202986.sh:25:24: note: Double quote to prevent globbing and word splitting. [SC2086] 8  

Prefiero minúscula para nombres de variables

Normalmente usamos nombres en mayúsculas para las variables de entorno destinadas a cambiar el comportamiento de los programas que usamos. Es mejor usar minúsculas para las variables de cáscara ordinarias.

Revise la falla del programa

En la actualidad, si la compilación falla, seguiremos adelante, probablemente con código antiguo. En su lugar, deberíamos abortar la ejecución si alguno de los pasos fallan. Es bastante fácil pedirle a la cáscara que haga esto por nosotros (aunque vale la pena aprender las excepciones); También podemos pedirle que verifique que no ampliamos ninguna variable indefinida, también:

  set -eu   

Uso inútil de interface0

Nunca he visto este patrón antes:

  interface1  

A menos que su nombre de archivo contiene espacios en blanco (el resto del código lo indica no), eso es exactamente

  interface2  

Conversión de fecha inusual

¿Realmente significa dar el archivo de resultados un nombre dado por el día dentro del año y el minuto, dentro de la hora? Esa es una combinación sorprendente, y ciertamente merece un comentario justificativo si es es realmente lo que quieres.

Evite los archivos temporales

El procesamiento de la tubería puede producir resultados con menor latencia que almacenar intermedios a archivos temporales. Podemos gasoducto una entrada en interface3 y cree la otra usando una sustitución de procesos en aproximadamente esta manera:

  interface4  

Considere usar Make

Si realiza un cambio a un solo archivo, debe volver a ejecutar el script (reinicio de todas las compilaciones y procesamiento de salida) para actualizar la salida final. Hacer es más inteligente: puede escribir reglas de patrones que le permitan volver a construir y volver a ejecutar lo que está desactualizado, sin perder tiempo y energía en los bits que no han cambiado.

También puede limpiar los archivos temporales, y podría escribir una regla " 998877665555443315 para limpiar todos los archivos de resultados.

Si usted escribe un makefile, ¡asegúrese de traerlo aquí para su revisión!

 

Automated suggestions

If you don't have shellcheck installed, grab it, or use the online service. It reports a bunch of questionable constructs:

202986.sh:4:1: warning: Use 'cd ... || exit' or 'cd ... || return' in case cd fails. [SC2164] 202986.sh:6:38: note: read without -r will mangle backslashes. [SC2162] 202986.sh:8:22: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:10:9: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:12:10: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:12:61: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:12:84: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:14:15: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:14:41: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:14:68: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:16:11: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:16:22: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:16:51: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:18:8: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:19:8: note: Double quote to prevent globbing and word splitting. [SC2086] 202986.sh:23:7: note: Use $(..) instead of legacy `..`. [SC2006] 202986.sh:25:7: note: Use ./*glob* or -- *glob* so names with dashes won't become options. [SC2035] 202986.sh:25:24: note: Double quote to prevent globbing and word splitting. [SC2086] 

Prefer lower-case for variable names

We normally use upper-case names for environment variables intended to change the behaviour of programs we use. It's better to use lower-case for ordinary shell variables.

Check for program failure

At present, if compilation fails, we'll still proceed, likely with old code. Instead, we should abort execution if any of the steps fail. It's pretty easy to ask the shell to do this for us (though it's worth learning the exceptions); we can also ask it to check we don't expand any undefined variables, too:

set -eu 

Useless use of xargs

I've never seen this pattern before:

echo "$filename" | xargs program 

Unless your filename contains whitespace (the rest of the code implies it doesn't), that's exactly

program "$filename" 

Unusual date conversion

Do you really mean to give the result file a name given by day-within-year and minute-within-hour? That's a surprising combination, and certainly deserves a justifying comment if it is really what you want.

Avoid temporary files

Pipeline processing can produce results with lower latency than storing intermediates to temporary files. We can pipeline one input into pdftk and create the other using a process substitution in roughly this manner:

enscript "$CPPFILE" | ps2pdf \     | pdftk - <(./a.out | enscript | ps2pdf) \             cat output "$TITLE.final.pdf" 

Consider using Make

If you make a change to a single file, you need to re-run the script (re-doing all the compilation and output processing) to update the final output. Make is more intelligent: you can write pattern rules that enable you to re-build and re-run only what's out of date, without wasting time and energy on the bits that haven't changed.

It can also clean up the temporary files, and you could write a "clean" rule to clean up all the result files.

If you do write a Makefile, be sure to bring it here for review!

 
 
         
         

Relacionados problema

13  ¿Fue este script Shell listo para la fuente abierta? (Fondo de pantalla Random XKCD)  ( Was this shell script ready for open source random xkcd wallpaper ) 
Escribí el siguiente script de shell y lo publicé en github . En el repo, también hay un archivo README que explica cómo usarlo con más detalle. Esta es la...

10  Mini- (Docker) -Shell  ( Mini docker shell ) 
Me dieron una asignación para escribir una mini-shell: Para escribir su propia cáscara, deberá comenzar con un programa C que pedirá que el usuario ingre...

3  Línea de comando FFMPEG para mostrar dos videos lado a lado  ( Ffmpeg command line for showing two videos side by side ) 
Aquí está la línea de comandos para jugar dos videos de lado a lado en sincronización en FFMPEG (FFPlay). Puede ser útil para los videos de comado, por ejempl...

6  Cáscara muy básica en el microcontrolador en C  ( Very basic shell on microcontroller in c ) 
Objetivo: Una cubierta ligera que se ejecuta en un microcontrolador (MSP430) y analiza los datos entrantes en un comando y adicionales parámetros. Requ...

7  SHELL SCRIPT Image Replication  ( Shell script image replication ) 
Tengo un script de shell que se está utilizando en una interfaz de máquina humana incrustada (HMI). Este script se utiliza para copiar algunos archivos de una...

3  Restablecer archivos en GIT que se muestran como modificados pero no tienen cambios de acuerdo con "Git Diff"  ( Reset files in git which show as modified but have no changes according to git ) 
Este parece para estar funcionando, pero también es bastante lento y me parece un poco hackeado. IFS=$' ' for currentFile in $(git status | grep "modifi...

2  Pasando las opciones de ayuda a un guión bash  ( Passing help options to a bash script ) 
Utilicé este código para dar, las opciones (ayuda) a mi guión de bash. Está funcionando bien y quería obtener el código revisado. while true; do if...

2  Comparando si es, y condición de caso  ( Comparing if else and case condition ) 
Tengo un script utilizado para instalar pocos rpms dependiendo del tipo de sistema operativo. Aquí, en este ejemplo, el script instalará paquetes en dos "Cent...

7  Script shell para descargar y extraer un tarball de GitHub  ( Shell script to download and extract a tarball from github ) 
No quiero que se ejecute nada si falla algún paso anterior: var traversed = [] // Start this func with the every index of the last sub array (top or bottom...

3  Funciones de manipulación de comando para un programa de concha de juguete  ( Command manipulation functions for a toy shell program ) 
Estoy escribiendo un pequeño programa que se supone que actúa como una concha de algún tipo. Funciona de unas pocas estructuras básicas, una de ellas es un 9...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos